【发布时间】:2017-04-04 16:10:30
【问题描述】:
我有 Item 类,它定义了自己的 operator new 和 operator 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;
};
我通过使用放置 new 来创建这种类型的对象,然后按如下方式删除:
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 调用了我自己的删除函数,其中除了输出日志之外什么都不做。但是,从输出来看,Item 的析构函数在 delete pI 中被调用,而我自己的删除函数中没有调用。
那么在这种情况下,析构函数会在重载的删除函数中被隐式调用吗?
【问题讨论】:
-
我使用的是 g++ 4.9.3
-
new和delete操作员都是一样的。您也不会在重载的new运算符中调用构造函数,它仍然会被调用。使用new和delete运算符时,始终会调用构造函数和析构函数。 -
内存分配和对象创建/销毁是两个不同的东西。重载分配函数只影响前者;后者完全由核心语言规则控制。
-
有趣的是 MSVC2015 发出警告:
warning C4291: 'void *Item::operator new(std::size_t,int,const std::string &)': no matching operator delete found; memory will not be freed if initialization throws an exception。 -
@Someprogrammerdude 我认为构造函数会被我自己的 operator new 调用的全局 operator new 调用
标签: c++ destructor delete-operator