C 可以使destuructor不称为班级成员和基类攻击方的灾难

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

本文关键字:攻击 基类 成员 destuructor 可以使      更新时间:2023-10-16

是否有一种方法可以使班级的驱动器不称为"班级成员"之一的破坏者和/或不称呼其基类的删除仪?

如果这是不可能的,是否可以通过安置新的和破坏(/不毁灭(手动创建某些类成员?谢谢!

编辑:我需要这个的原因:C类拥有对象M。M具有非平凡的破坏者。C是M的朋友,并以某种方式管理M的MAND MANE MANDE无需称呼M的驱动器。可以称呼它是可以的,但意味着性能开销。(在这种情况下,这是一个问题。(我当时在想将A派生为M的A派生级别,该类别的驱动器无助,但这仍然称为基础的攻击者。

在施工时,C 确保首先调用子类配件,然后构成成员,最后应用适当的构造函数。在破坏时,符号进行了。

这意味着您无法在对象被破坏后立即阻止基础类驱动器的应用,也无法阻止任何成员构造函数。如果您只想破坏某些东西,则必须找到一种不破坏对象的方法(只需使用原始指针...(,并在想要的东西上手动调用破坏者。但是您当然不想这样做!

C 对程序员技能非常有信心,因此很容易编写一个调用不确定行为的程序。如果您发现自己试图颠覆C 编译器,以不称呼基类或成员的破坏者,那么您会有一个重大问题。您不想销毁的成员不应该是成员,而是更可能是指针(原始或共享(或对具有其终生管理的外部对象的引用。 base类也可能是指指针或对外部对象的引用,在这里,生命周期可以(并且应该(在课堂之外进行管理。

如果驱动器具有可观察到的副作用,那么在不调用灾难的情况下结束对象的寿命将是不确定的行为。C 14 [BASIC.LIFE]/4:

程序可以通过重复对象所占据的存储或明确调用具有非平凡驱动器的类型对象的驱动器来结束任何对象的寿命。对于具有非平凡驱动器的类类型的对象,该程序不需要在重用或释放对象所占据的对象占据的存储之前明确调用灾难。但是,如果没有明确呼叫击击器,或者不使用删除表达来释放存储空间,则不应隐式调用驱动器,并且任何取决于驱动器产生的副作用的程序都具有不确定的行为。<<<<<<<<<<<<<<<<<</p>

所以,没有办法解决它。也许您可以重新设计您的代码,以便驱动器不会执行任何不必要的语句,或者其他内容。