我正在创建一个内存管理器,为此,我正在覆盖new
和delete
运算符。当我使用刚刚打印到屏幕上的自定义delete
时,对象仍然被破坏。
void operator delete(void* pointer)
{
//does nothing
printf("overrode delete\n");
//MemoryManager::get().deallocHeap(pointer);
}
struct X
{
int xx;
X(int x) : xx(x)
{
printf("x constructor\n");
}
~X()
{
printf("x destructor\n");
}
};
int main(int argc, char* argv[])
{
X* a = new X(20);
delete a;
getchar();
return 0;
}
输出结果为:
x constructor
x destructor
overrode delete
如果除了在delete
中打印之外没有代码,为什么要调用X
析构函数?
答案 0 :(得分:3)
将为代码中的所有类调用全局删除运算符 - 可能需要相应的全局新运算符。
每当销毁该类的类时,就会调用析构函数X(任何具有析构函数的类)。所以delete a;
导致它被调用(在释放内存之前)
答案 1 :(得分:1)
此处操作员删除您要覆盖的内容并非专门用于打印 " overrode delete"但也以标准方式使用它,即它删除指针所指向的对象,从而调用析构函数。因此,删除操作符正在以两种方式使用。
答案 2 :(得分:1)
因为在调用delete a
释放它占用的内存之前需要a
来销毁operator delete
。就像新表达式既分配内存然后在其中构造对象一样。