У меня есть класс Item
, который определяет свой собственный оператор новый и оператор удалить следующим образом:Является ли деструктор неявным в функции перегруженного оператора delete?
class Item
{
public:
Item(const std::string &s):msg(s)
{
std::cout<<"Ctor: "<<msg<<std::endl;
}
static void* operator new(size_t size, int ID, const std::string &extra)
{
std::cout<<"My Operator New. ID/extra: "<<ID<<"/"<<extra<<std::endl;
return ::operator new(size);
}
static void operator delete(void* p)
{
std::cout<<"My Operator Delete"<<std::endl;
return;
}
~Item()
{
std::cout<<"Destructor: "<<msg<<std::endl;
}
void Print()
{
std::cout<<"Item::msg: "<<msg<<std::endl;
}
private:
std::string msg;
};
создать объект этого типа с помощью размещения новых и затем удалить следующим образом:
int main()
{
Item *pI=new(1,"haha")Item("AC Milan");
std::cout<<"before delete"<<std::endl;
delete pI;
std::cout<<"after delete"<<std::endl;
return 0;
}
выход:
My Operator New. ID/extra: 1/haha
Ctor: AC Milan
before delete
Destructor: AC Milan
My Operator Delete
after delete
Как вы можете видеть, delete pI
называет свою собственную функцию удаления, в котором nothi ng выполняется за исключением вывода журнала. Однако из результата деструктор Item
вызывается в delete pI
, который не вызывается в моей собственной функции удаления.
Итак, в этом случае деструктор будет называться неявным образом в перегруженной функции удаления?
Я использую g ++ 4.9.3 –
Это то же самое для ваших 'новых' и ваших' delete' операторов. Вы также не вызываете конструктор в свой перегруженный оператор 'new', и он все еще вызывается. Конструкторы и деструкторы всегда вызывается при использовании операторов 'new' и' delete'. –
Распределение памяти и создание/разрушение объекта - две разные вещи. Перегрузка функций распределения влияет только на первое; последний полностью контролируется основными языковыми правилами. –