Lidström先生认为一个这样的构造函数shared_ptr<Base> p(new Derived);
并不要求Base必须有虚析构函数:
Armen Tsirunyan: "真的吗? shared_ptr会正确清理吗? 请在此情况下演示如何实现该效果"
Daniel Lidström: "shared_ptr使用自己的析构函数来删除Concrete实例。这在C++社区中被称为RAII。我的建议是,尽可能了解RAII。当您在所有情况下都使用RAII时,它将使您的C++编码变得更加容易。"
Armen Tsirunyan: "我知道RAII,我也知道最终shared_ptr析构函数可以在pn达到0时删除存储的px。但是如果px具有指向
Base
的静态类型指针和指向Derived
的动态类型指针,那么除非Base
有虚构造函数,否则这将导致未定义行为。如果我说错了,请纠正我。"Daniel Lidström: "shared_ptr知道静态类型是Concrete。它知道这一点,因为我在构造函数中传递了它!看起来有点像魔术,但我可以向您保证这是经过设计的,非常好用。"
那么,请评判我们。如何(如果可能)实现shared_ptr而不需要多态类具有虚构造函数?
shared_ptr<void> p(new Derived)
也会通过它的析构函数销毁Derived
对象,无论它是否为虚拟的。 - dalleshared_ptr<T>((T*)new U())
的情况下,其中struct U:T
将不会按预期工作(这可以通过间接方式轻松完成,例如一个接受T*
但传递了U*
的函数)。 - Yakk - Adam Nevraumont