Свободен ли этот код памяти памяти?
char *buffer = (char *) (::operator new(n));
delete buffer;
Отличается ли он от варианта «традиционной скобочной формы» (когда мы говорим о примитивных типах):
char *buffer = new char[n];
delete[] buffer;
Я предполагаю, что есть 3 варианта:
a) будет освобожден только 1 байт (n - 1 утечка)
b) будет освобожден весь выделенный блок (n байтов)
в) неопределенное поведение (реализация зависит)
Мои мысли: для примитивного типа char
только free
срабатывает (не вызывается деструктор) и free
знает, сколько байтов должно быть освобождено (чтохранится в метаинформации распределителя). Итак, этот код должен быть правильным.
Добавлено:
Смешивание operator new/delete
и expression new/delete
приведет к неопределенному поведению. Так что это плохой код.
Опция использования operator delete
также плоха в соответствии с http://eel.is/c++draft/expr.delete#2:
char *buffer = (char *) (::operator new(n));
::operator delete(buffer);
Так что единственный вариант:
char *buffer = new char[n];
delete[] buffer;