Tim*_*ing 8 c++ destructor delete-operator
我有一个类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;
};
Run Code Online (Sandbox Code Playgroud)
我使用placement 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;
}
Run Code Online (Sandbox Code Playgroud)
输出是:
My Operator New. ID/extra: 1/haha
Ctor: AC Milan
before delete
Destructor: AC Milan
My Operator Delete
after delete
Run Code Online (Sandbox Code Playgroud)
如您所见,delete pI
调用我自己的删除功能,除了输出日志之外没有任何操作.但是,从输出Item
中调用析构函数,delete pI
在我自己的删除函数中不调用析构函数.
那么在这种情况下,析构函数会在重载删除函数中隐式调用吗?
那么在这种情况下,析构函数将在重载的delete函数中隐式调用吗?
是。对于delete表达式,(1)首先调用析构函数,然后(2)operator delete
调用apporiate ;名称查找和重载解析将在此阶段执行。
如果expression不是非空指针,则delete表达式将为要销毁的对象或销毁数组的每个元素(从数组的最后一个元素到第一个元素)调用析构函数(如果有)。
此后,除非匹配的new-expression与另一个new-expression(自C ++ 14开始)组合在一起,否则delete表达式将调用释放函数,
operator delete
(对于表达式的第一个版本)或operator delete[]
(对于表达式的第二个版本) )。
归档时间: |
|
查看次数: |
545 次 |
最近记录: |