C++ 防止成员变量的破坏

C++ 防止成员变量的破坏,c++,destructor,object-lifetime,C++,Destructor,Object Lifetime,我怀疑这是不可能的,但在下面创建了A和B的情况下,我希望重用B(通过将其放入准备重用的堆栈中),但删除A。它们是从父类派生的许多类中的两个,我希望负责删除对象的代码能够对所有派生对象执行相同的操作 是否可以覆盖Derived2的析构函数/删除运算符,从而不调用data2的析构函数?然后,将B放入堆栈中,并在构建过程中分配所有数据,以备重用,这将是一件简单的事情 (编辑:为了澄清,我想重用B,它有大量不同类型的成员变量,具体取决于所涉及的派生类。我非常感谢所有的建议,但我使用了一个非常简单的示例来

我怀疑这是不可能的,但在下面创建了A和B的情况下,我希望重用B(通过将其放入准备重用的堆栈中),但删除A。它们是从父类派生的许多类中的两个,我希望负责删除对象的代码能够对所有派生对象执行相同的操作

是否可以覆盖Derived2的析构函数/删除运算符,从而不调用data2的析构函数?然后,将B放入堆栈中,并在构建过程中分配所有数据,以备重用,这将是一件简单的事情

(编辑:为了澄清,我想重用B,它有大量不同类型的成员变量,具体取决于所涉及的派生类。我非常感谢所有的建议,但我使用了一个非常简单的示例来找出这种特殊方法是否可行,因为实际类包含大量无关的额外代码(对眼前的问题不作回答)


这样做(如果可能的话)会被视为违反RAII设计模式吗?

*SNIP-在对场景进行澄清后,我在最初的评论中发布了这个答案*


这样如何。在堆栈中存储unique_ptr。当从堆栈弹出时,从unique_ptr抓取原始指针并将其推入另一个unique_ptr中-第二个指针使用自定义删除器声明,该删除器在销毁时保留堆栈的位置并执行与弹出操作相反的操作。这将与共享_ptr一起工作r也是,但显然这取决于你需要什么


它独立于B的类型,可以完全封装在堆栈类中(除非是唯一的\u ptr+deleter类型,但那只是一个typedef)。

不是按值存储
data2
,而是使用指针存储它,并在构造函数中分配它。这样,当您删除
B
(除非在
Derived2
析构函数中调用
delete
).

如果您想重用B,请不要删除它。不,我想重用B,但我想将其重用的责任封装在Derived2中,而不必增加负责删除对象的代码的复杂性/依赖性。如果我对问题的描述含糊不清,请道歉。@SteveJessop我想他不想,我想他想以确保对象在其堆栈上或位于代码中的其他位置,以独占和安全的方式。@Polkadtcadaver:是的,我想我一定是误读了这个问题。现在这个问题有意义了。谢谢你的建议。我熟悉智能指针,但想不出一种不引人注目的方法来解决这个问题。我希望从中弹出对象堆栈在使用时会被删除,在删除时会被推回。据我所知,我必须在堆栈中(或其他地方)保留一份副本为了防止使用共享指针删除它,虽然我肯定会错过一个更简单/更好的解决方案。这样如何。在堆栈中,存储唯一的\u ptr。当从堆栈中弹出时,您从唯一的\u ptr中抓取原始指针,并将其推到另一个唯一的\u ptr中-第二个使用自定义的删除器声明,该删除器在销毁时重新启动获取堆栈的位置并执行pop操作的相反操作。这也适用于shareD_ptr,但显然这取决于您需要什么。这听起来似乎可行,而且不需要修改现有代码。比我希望的更复杂,但我对我的方法是否可行并不乐观。正如您所说,它是独立的类型为B,可以完全封装在堆栈类中(除非是唯一的_ptr+deleter类型,但那只是一个typedef)。@mycroft.holmes编辑后将建议包含在我的评论中。
class Parent{
    ...
};

class Derived1:Parent{
    DataClass data1;
};

class Derived2:Parent{
    DataClass data2;
};

Derived1* A = new Derived1();
Derived2* B = new Derived2();
delete A;
delete B;