В проекте С++ при написании кода сортировки слиянием выдает предупреждение об ошибке С6011: Dereferencing NULL pointer

Написал сортировку слиянием. Программа компилируется, все работает, но постоянно выдает предупреждение об ошибке С6011: Dereferencing NULL pointer. Объясните пожалуйста, почему она возникает именно в этих местах(ниже приложу фото кода), ведь не может для разыменования туда попадать нулевой указатель. введите сюда описание изображения

Код:

 template <typename T>
void Merge(vector<T>& a, int first, int last) {
    int middle = (first + last) / 2;
    int start = first;
    int index = first;
    int finish = middle + 1;
    if (a[middle] < a[(size_t)middle + 1])
        return;
    int size = last - first + 1;
    vector<T> tmp;
    tmp.reserve(size);
    /*T* tmp;
    tmp = (T*)malloc((size) * sizeof(T));
    if (tmp == nullptr) {
        throw "ups"; 
    }*/
    
    while (start <= middle && finish <= last) {
        if (a[start] <= a[finish]) {
            tmp.push_back(a[start]);
            //tmp[index - first] = a[start];
            //*(tmp + index - first) = a[start];
            start++;
            index++;
        }
        else {
            tmp.push_back(a[finish]);
            //tmp[index - first] = a[finish];
            //*(tmp + index - first) = a[finish];
            finish++;
            index++;
        }
    }

    while (start <= middle) {
        tmp.push_back(a[start]);
        //tmp[index - first] = a[start];
        //*(tmp + index - first) = a[start];
        start++;
        index++;
    }

    while (finish <= last) {
        tmp.push_back(a[finish]);
        //tmp[index - first] = a[finish];
        //*(tmp + index - first) = a[finish];
        finish++;
        index++;
    }

    for (int i = first; i <= last;i++)
        //a[i] = *(tmp + i - first);
        a[i] = tmp[i - first];
    //a[i] = tmp[i - first];
    //free(tmp);
}

Ответы (1 шт):

Автор решения: KoVadim

Ругается, потому что malloc может неожиданно вернуть nullptr. Просто добавьте проверку на это и завершайте программу

tmp = (T*)malloc((size) * sizeof(T));
if (tmp == nullptr) {
    // exit(1);
    throw "ups"; // я знаю, что так не очень, но для примера сойдет
}

либо будьте последовательны и используйте new

tmp = new T[size];

и никаких ругательств. (да, не забудьте о delete [])

→ Ссылка