unepic, это не утечка, это неопределённое поведение, которое на практике скорее всего приведёт к крешу программы, т.к. оператору delete[] передали указатель, память для которого не выделялась через new[].
Оператор delete[] проигнорировал бы нулевой указатель. Но на левый указатель он отреагирует неизвестно как.
На ideone программа с кодом
int main()
{
int* p = new int[100]; p++; delete[] p;
}
А ещё лучше вообще не использовать сырых new[]. Нужен динамический массив -- возьмите std::vector или (если совсем уж не хочется тратить лишнее место на хранение size и capacity) std::unique_ptr.
Код вида
a = new int[N];
b = new int[M];
c = new int[L];
является небезопасным относительно исключений.
Даже если вы правильно напишете всё в конструкторах, операторах= и деструкторах (что тоже немаленький кусок работы), риск утечек всё равно будет, если в приложении включены C++ exceptions.
Представьте, что первый оператор new[] отработал успешно, а второй вылетел с std::bad_alloc. В таком случае никто первый массив не освободит. Если это код конструктора, деструктор при вылете эксепшена вызван не будет, поскольку деструкторы вызываются только для полностью созданных объектов, конструктор которых отработал успешно.
Зато деструкторы уже создавшихся полей класса вызовутся нормально в любом случае, поэтому с вектором или юник_поинтером вы будете в безопасности даже в такой ситуации.
Написано
Войдите на сайт
Чтобы задать вопрос и получить на него квалифицированный ответ.
Оператор delete[] проигнорировал бы нулевой указатель. Но на левый указатель он отреагирует неизвестно как.
На ideone программа с кодом
безбожно крешится: *** Error in `./prog': free(): invalid pointer: 0x0000561f3f72bc24 ***