• Почему нельзя применять инкремент к имени массива?

    @Mace_UA
    unepic, это не утечка, это неопределённое поведение, которое на практике скорее всего приведёт к крешу программы, т.к. оператору delete[] передали указатель, память для которого не выделялась через new[].
    Оператор delete[] проигнорировал бы нулевой указатель. Но на левый указатель он отреагирует неизвестно как.

    На ideone программа с кодом
    int main()
    {
    	int* p = new int[100]; p++; delete[] p;
    }

    безбожно крешится: *** Error in `./prog': free(): invalid pointer: 0x0000561f3f72bc24 ***
  • Что означает этот кусок кода?

    @Mace_UA
    Почти. Перед передачей char в эти функции его нужно скастить к unsigned char. Иначе можно нарваться на UB на некоторых платформах со знаковым char'ом.
  • Как освободить память сразу всем полям структуры?

    @Mace_UA
    А ещё лучше вообще не использовать сырых 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. В таком случае никто первый массив не освободит. Если это код конструктора, деструктор при вылете эксепшена вызван не будет, поскольку деструкторы вызываются только для полностью созданных объектов, конструктор которых отработал успешно.

    Зато деструкторы уже создавшихся полей класса вызовутся нормально в любом случае, поэтому с вектором или юник_поинтером вы будете в безопасности даже в такой ситуации.