C++ 停止调用析构函数

C++ 停止调用析构函数,c++,C++,我有一个类,我正在重载new和delete(它们从内存池获取内存并将内存返回内存池)。让我沮丧的是,在调用delete重载函数get之前,重载的类仍然调用了它的析构函数。我怎样才能阻止这一切 class Message { ~Message() { ... } void* operator new(std::size_t sz) { ... } void operator delete(void* ptr) { ... } }; 编辑: 我正确地认为类的成员将被析构函

我有一个类,我正在重载new和delete(它们从内存池获取内存并将内存返回内存池)。让我沮丧的是,在调用delete重载函数get之前,重载的类仍然调用了它的析构函数。我怎样才能阻止这一切

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

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

我正确地认为类的成员将被析构函数破坏,但内存不会被析构函数释放;delete函数有这个职责,在这种情况下,我可以阻止内存被释放吗

结果:
Penny说内存的分配/释放和构造/销毁是分开的。我现在有空的析构函数和重载的new/delete。

我认为您无法阻止调用析构函数,我不知道您为什么要这样做。必须在释放内存之前销毁对象-如果超类分配了一些资源,则其析构函数必须在释放对象内存之前释放这些资源

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


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

破坏和取消分配是两个正交的东西,一个不应该抑制另一个。您将如何处理在堆栈上创建的类实例?不清理他们的资源?您试图打破一个非常有用的概念。

如果您关心(a)从特定池中获取内存和(b)控制何时调用析构函数,一个选项是:


(从上面链接到C++ FAQ的代码)

回答你的问题,是的,构造函数和析构函数是否被称为重载新的或删除的。
回答一个您没有问过的问题,这是否是使用内存池对象的好解决方案,答案通常是--“否”。您需要的是您的类,使用内存池来获取分配器类。它提供了更大的灵活性,通常情况下,您不只是拥有一个类,还有许多类将被放入内存池中,所以您不希望所有新的/删除函数都有大量重载。此外,拥有多个分配方案(以及相应的分配器)并不罕见,但您只能重载new/delete一次。

7年后,看起来可能很聪明,不过让我来写一下

标准C++(17/20)非常多,或者正如Creator所说:“新语言”。 所以,如果你真的需要的话,请选择值(以及必要的引用)并使用“智能”指针。


最重要的是,忘记重载new和/或delete。你知道这个练习:)

我不知道为什么这会令人沮丧;C++在这方面是非常合乎逻辑的。如果你不需要它,就可以做一个空析构函数。回答你的问题:如何防止在C++中调用析构函数?这只有在使用placement new进行分配时才能实现,在这种情况下,您(作为程序员)必须负责手动调用析构函数(如Doug所说:p->~Foo::Foo();)。这是语言中程序员必须手动调用析构函数的唯一实例。
void* raw = allocate(sizeof(Foo));  // line 1
Foo* p = new(raw) Foo();            // line 2

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