#c
#c
Вопрос:
Хорошо, допустим, у меня есть объект, выделенный из кучи… если я использую placement new и создам новый объект в ячейке памяти, где раньше «жил» другой, приведет ли это к утечке памяти? Или, и это то, что я думаю, он перезапишет его?
Object* ptr = new Object(1);
new(ptr) Object(2);
Или мне нужно будет явно вызвать деструктор, потому что он не перезаписывается?
Object* ptr = new Object(1);
delete ptr;
new(ptr) Object(2);
Комментарии:
1. почему вы используете placement new в первую очередь?
2. Не утечка памяти, а неопределенное поведение, которое заставит демонов вылететь из вашего носа .
3. я делаю некоторые странные вещи с массивами, и это просто вопрос, который я придумал, и я нигде не могу его найти
4.
delete
делает больше, чем просто вызывает деструктор.5. Не все вопросы, которые делают то, что конкретно не имеет смысла в их сценариях, обязательно плохие. Они тоже могут быть чисто из любопытства. Поэтому нужно перестать отвечать на все эти вопросы вопросом «зачем тебе это делать?».
Ответ №1:
Оба варианта неверны.
Вызов нового оператора вызывает 2 вещи: выделение памяти и вызов конструктора. Размещение new вызывает конструктор только для предварительно выделенной части памяти. С другой стороны, вызов delete приводит как к вызову деструктора, так и к освобождению памяти. Что вам нужно сделать после размещения new, так это явно вызвать деструктор. Но в C лучшим вариантом всегда является использование шаблона RAII.
Ответ №2:
При размещении new вам нужно явно вызвать деструктор, который отличается от вызова delete
.
Что-то вроде:
typename std::aligned_storage<sizeof(Object), alignof(Object)>::type buffer;
Object* ptr = new (amp;buffer) Object(1);
// ...
ptr->~Object(); // Destructor call.