Я не предпочитаю ни того, ни другого.
Явный вызов деструктора нужен очень, очень редко, только когда вы отделяете выделение памяти от времени жизни объекта. Это может понадобиться при реализации пользовательского класса контейнера.
Явный delete
потенциально является законным способом уничтожения объекта, динамически создаваемого с помощью выражения new
, но в большинстве программных приложений это не нужно, поскольку он указывает на место, где могут возникнуть потенциальные несоответствия между новым и удаленным. и районы с потенциальными исключениями проблем безопасности.
Если время жизни объекта ограничено блоком, обычно предпочтительнее использовать локальную переменную, поскольку накладные расходы на выделение памяти, как правило, ниже, и объект будет автоматически очищен правильно, однако блок завершен.
{
// ...
Object object( ... );
} // object destructor run, however this block is exited.
Если есть какая-то причина, по которой это может не понадобиться (например, объект имеет чрезмерный статический размер) или его время жизни не может быть сопоставлено с конкретной областью действия, то обычно для управления следует использовать какой-то интеллектуальный указатель время жизни объектов. Самый базовый интеллектуальный указатель, доступный в стандарте C ++, - это std::auto_ptr
, который можно использовать для динамически размещаемых объектов в области блока, но при копировании и назначении он имеет «удивительное» поведение. Что-то вроде tr1::shared_ptr
(или boost::shared_ptr
) - это общие альтернативы, когда необходимо совместное владение.
{
std::auto_ptr<Object> object(new Object(...));
// ...
} // *object destructor run, however this block is exited.