Нужно ли мне вызывать де деструктор здесь?

#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.