覆盖删除行为

时间:2015-09-02 17:37:28

标签: c++

我正在创建一个内存管理器,为此,我正在覆盖newdelete运算符。当我使用刚刚打印到屏幕上的自定义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析构函数?

3 个答案:

答案 0 :(得分:3)

将为代码中的所有类调用全局删除运算符 - 可能需要相应的全局新运算符。

每当销毁该类的类时,就会调用析构函数X(任何具有析构函数的类)。所以delete a;导致它被调用(在释放内存之前)

答案 1 :(得分:1)

此处操作员删除您要覆盖的内容并非专门用于打印 " overrode delete"但也以标准方式使用它,即它删除指针所指向的对象,从而调用析构函数。因此,删除操作符正在以两种方式使用。

答案 2 :(得分:1)

因为在调用delete a释放它占用的内存之前需要a来销毁operator delete。就像新表达式既分配内存然后在其中构造对象一样。