停止调用析构函数

时间:2011-01-25 18:59:01

标签: c++

我有一个类,我正在重载new和delete(这些获取并从内存池返回内存)。令我感到沮丧的是,我重载的类仍然在调用delete重载函数之前调用了析构函数。我怎么能阻止这个?

class Message
{
    ~Message() { ... }

    void* operator new(std::size_t sz) { ... }
    void operator delete(void* ptr) { ... }
};

修改

我认为类的成员会被破坏但是破坏者不会释放记忆; delete函数拥有这个责任,在这种情况下,我可以阻止内存被解除分配吗?

观察: Penny拒绝了内存和构造/销毁的分配/释放是单独的项目。我现在有空的析构函数并重载了new / delete。

5 个答案:

答案 0 :(得分:6)

破坏和解除分配是两个正交的事情,一个不应该抑制另一个。对于在堆栈上创建的类的实例,您会怎么做?没有清理他们的资源?您正试图打破一个非常有用的RAII概念。

答案 1 :(得分:4)

我认为你不能阻止析构函数被调用,我不确定你为什么要这样做。在释放内存之前必须销毁对象 - 如果超类分配了一些资源,它的析构函数必须在对象的内存空闲之前释放它们。

编辑后编辑:是的,析构函数会清理它们分配的任何内容,但不会释放对象的内存。您正在撰写的delete方法就是这样做的。

顺便说一句,好名字。 : - )

答案 2 :(得分:3)

如果您担心(a)从特定池中获取内存并且(b)控制何时调用析构函数,则一个选项是placement new

void* raw = allocate(sizeof(Foo));  // line 1
Foo* p = new(raw) Foo();            // line 2

p->~Foo();   // explicitely call destructor

(代码取自上面链接到C ++ FAQ)

答案 3 :(得分:0)

回答你的问题,无论你是否超载new / delete,都会调用构造函数和析构函数。

回答一个你没有问的问题,对于使用带内存池的对象是否是一个很好的解决方案,答案通常是“不”。你想要的是你的类,使用内存池来获取一个allocator类。它允许更多的灵活性,通常你不仅有一个类,而是许多将被放入内存池,所以你不希望所有新/删除函数的质量重载。此外,拥有多个分配方案(以及分配器)并不罕见,但您只能重载新/删除一次。

答案 4 :(得分:0)

7年后,它可能很容易显得聪明,但是让我写下这个。

标准C ++(17/20)非常value semantics driven language,或者作为创作者说:“新语言”。

所以,如果你真的需要,请选择值(和必要的引用)并使用“智能”指针。 最重要的是忘记重载新的和/或删除。你知道演习:)