2
volovziЦитата:
только вызывается конструктор того объекта, адрес которого передан в качестве параметра
...
два раза вызывается конструктор одного и того же объекта, а при попытке освободить память возникает ошибка
Кажется, вы не правы. Как я уже сказал, такой синтаксис используется для размещения объектов в заранее приготовленной памяти. В вашем примере вместо
test t может быть любой другой объект достаточного размера (например,
char p[1000] :) ) и именно его адрес вы можете передавать в качестве параметра оператору
new. Кстати, первый вызов конструктора выполняется именно за счет объявления
test t, второй -- за счет оператора
new (это можно проверить вставив между соответствующими строчками отладочную печать).
Эта ситуация интересна тем, что вообще-то удалять таким образом созданный объект вы должны очень аккуратно. Во-первых,
delete (стандартный) использовать нельзя (ошибку вы видели). Это тот случай, когда в C++ пригождается возможность явного вызова деструктора -- вместо
delete tt надо писать
tt->test::~test(), или
tt->~test(), если нужен виртуальный вызов.
Конкретно в вашем случае, есть дополнительная опасность автоматического вызова деструктора для объекта
t, который уже фактически был уничтожен.