是否有一种方法可以使类的析构函数不调用某个类成员的析构函数和/或不调用其基类的析构函数?
如果这是不可能的,是否手动创建具有新位置和析构(/不-析构)的类成员是可能的解决办法?谢谢!
编辑:我需要这样做的原因:C类拥有对象M有一个非平凡的析构函数。C是M的朋友,以一种不需要调用M的析构函数的方式来管理M。调用它是可以的,但它意味着性能开销。(在这种情况下是个问题。)我在考虑从M生成一个派生类,它有一个不做任何事情的析构函数,但是它仍然会调用基的析构函数。
发布于 2017-05-30 12:02:13
在构造时,C++确保首先调用子类构造器,然后构造成员,最后应用适当的构造函数。在毁灭的时候,系统就完成了。
这意味着,一旦对象被解构,就不能阻止基类析构函数的应用,也不能阻止任何成员构造函数的应用。如果您只想销毁一些,您必须找到一种方法来不破坏对象(只使用一个原始指针.)手动调用析构函数。但你当然不想这么做!
C++对程序员的技能非常有信心,因此很容易编写一个调用未定义行为的程序。如果您发现自己试图颠覆C++编译器而不调用基类或成员的析构函数,则有一个主要问题。不想销毁的成员不应该是成员,而更可能是指针(原始的或共享的)或对具有自己的生存期管理的外部对象的引用。基类可能也应该是指向外部对象的指针或引用,在这里,生存期可以(而且应该)管理在类之外。
发布于 2017-05-30 12:17:20
如果析构函数有明显的副作用,那么在不调用析构函数的情况下结束对象的生命周期是未定义的行为。C++14 basic.Life/4中介绍了这一点:
程序可以通过重用对象占用的存储或显式调用具有非平凡析构函数的类类型对象的析构函数来结束任何对象的生存期。对于具有非平凡析构函数的类类型的对象,在对象占用的存储被重用或释放之前,程序不需要显式调用析构函数;但是,如果没有对析构函数的显式调用,或者如果未使用删除-表达式释放存储,则不应隐式调用析构函数,并且任何依赖于析构函数产生的副作用的程序都具有未定义的行为。
所以,没有办法绕过它。也许您可以重新设计代码,这样析构函数就不会执行任何不必要的语句或什么的。
https://stackoverflow.com/questions/44261086
复制相似问题