免责声明:我知道这是糟糕的devise,我只是出于好奇而提出这个问题,以便获得有关C ++析构函数如何工作的更深层次的知识。 在C#中,可以在类的析构函数中写入: GC.KeepAlive(this) (见下面的编辑) ,这意味着即使在析构函数调用完成后,对象仍然会在内存中活着。 C ++的devise是否允许从类似于上述C#algorithm的析构函数中恢复对象? 编辑 :正如下面的答案指出的, GC.ReRegisterForFinalize()与GC.KeepAlive(this)的问题更紧密相关。
在堆栈溢出后检查C ++ 11中的对象types ,我有评论: 在C ++ 11中,你实际上想要做virtual ~A() = default; 否则,你将失去implict构造函数。 什么是virtual ~A() = default; 对于? 如何隐式地移动构造函数与virtual ~A() {} ?
Lidström先生和我有一个观点 🙂 Lidström先生的说法是构造shared_ptr<Base> p(new Derived); 不需要Base有一个虚拟析构函数: Armen Tsirunyan :“真的吗? shared_ptr能够正确清理吗?在这种情况下,请您certificate这个效果如何实现? DanielLidström :“ shared_ptr使用自己的析构函数来删除具体的实例,这在C ++社区中被称为RAII,我的build议是你可以学习关于RAII的所有知识,当你使用C ++时, RAII在所有情况下。“ Armen Tsirunyan :“我知道RAII,而且我也知道,当pn达到0时, shared_ptr析构函数最终可能会删除存储的px。但是,如果px具有指向Base静态types指针和指向Deriveddynamictypes指针,则除非Base具有虚拟析构函数,这会导致不确定的行为,如果我错了,纠正我。 DanielLidström :“ shared_ptr知道静态types是Concrete,它知道这个,因为我在构造函数中传递它,看起来有点像魔术,但我可以向你保证它是有devise的,非常好。 所以,评判我们。 怎么可能(如果是的话)实现shared_ptr而不要求多态类具有虚拟析构函数? 提前致谢