C ++可以使析构函数不调用类成员的析构函数和基类的析构函数?


C++ Possible to make a destructor NOT call the destructor of class members and the destructor of the base class?

有没有一种方法可以使类的析构函数不调用其中一个类成员的析构函数和/或不调用其基类的析构函数?

如果这是不可能的,那么用placement new和destruction(/not destruction)手动创建某些类成员是否是一种可能的解决方法?谢谢!

编辑:我需要这样做的原因是:类C拥有对象M.M有一个非平凡的析构函数。C是M的朋友,管理M的方式不需要调用M的析构函数。可以调用它,但这意味着性能开销。(在这种情况下是个问题。)我想从m中生成一个派生类,该类有一个析构函数,它什么也不做,但这样仍然会调用基的析构函数。


在构造时,C++确保首先调用子类构造函数,然后构造成员,最后应用适当的构造函数。在销毁时,完成对称。

这意味着一旦对象被销毁,就不能阻止基类析构函数或任何成员构造函数的应用。如果您只想销毁一些,您必须找到一种不销毁对象的方法(只使用原始指针…)并手动调用所需的析构函数。但你肯定不想这样做!

C++对程序员的技能非常有信心,所以编写一个调用未定义行为的程序是很容易的。如果发现自己试图颠覆C++编译器不调用基类或成员的析构函数,则存在一个主要问题。不希望销毁的成员不应是成员,而应更可能是指针(原始或共享)或对将具有其自身生存期管理的外部对象的引用。基类也应该是指向外部对象的指针或引用,这里生命周期也可以(并且应该)在类之外进行管理。


如果析构函数有可观察到的副作用,那么在不调用析构函数的情况下终止对象的生命周期将是未定义的行为。这是用C++ 14 [基本·生命] / 4覆盖的:

A program may end the lifetime of any object by reusing the storage which the object occupies or by explicitly calling the destructor for an object of a class type with a non-trivial destructor. For an object of a class type with a non-trivial destructor, the program is not required to call the destructor explicitly before the storage which the object occupies is reused or released; however, if there is no explicit call to the destructor or if a delete-expression is not used to release the storage, the destructor shall not be implicitly called and any program that depends on the side effects produced by the destructor has undefined behavior.

所以,没有办法绕过它。也许您可以重新设计代码,这样析构函数就不会执行任何不必要的语句或其他什么。