В проекте С++ при написании кода сортировки слиянием выдает предупреждение об ошибке С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 [])