Если бы я сделал размещение нового на объектах, которые уже созданы в стеке:Размещение нового перезапись существующих объектов
struct s{
s() { std::cout << "C\n";}
~s() { std::cout << "D\n";}
};
int main() {
s s1[3];
for(int i=0; i< 3; ++i)
s* newS = new (&s1[i]) s();
}
я получаю:
C
C
C
C
C
C
D
D
D
Таким образом, мы не получаем деструкторы для первых 3-х объектов , это безопасно? Если мы просто переопределяем память для объектов, выделенных в куче/стеке, и что объекты не должны освобождать какие-либо ресурсы в деструкторах, это все еще безопасно?
Я не вижу, как это неправильно, вы создаете 3 объекта на стеке, вы получаете конструкторами для тех 3 - то вы используете размещение нового воссоздавать 3 объекта снова в том же месте, чтобы вы снова получили 3 конструктора, и в конце вы получаете 3 деструктора. Вы ожидаете чего-то другого? –
Вообще говоря, это небезопасно. Вы должны явно уничтожить объекты, которые были созданы до повторного использования базового хранилища. –
Очень опасно - деструкторы, вызываемые для исходных 3 объектов, не для 3, созданных с новым размещением. Это может вызвать удивление. –