问题
Since boost::/std::shared_ptr
have the advantage of type-erasing their deleter, you can do nice things like
#include <memory>
typedef std::shared_ptr<void> gc_ptr;
int main(){
gc_ptr p1 = new int(42);
gc_ptr p2 = new float(3.14159);
gc_ptr p3 = new char('o');
}
And this will correctly delete all pointer thanks to the correct deleter being saved.
If you ensure that every implementation of your interface always gets created with shared_ptr<Interface>
(or make_shared<Interface>
), do you actually need a virtual
destructor? I would declare it virtual
anyways, but I just want to know, since shared_ptr
will always delete the type it was initialized with (unless another custom deleter is given).
回答1:
I would still follow the common rule for classes that are meant to be derived:
Provide either a public virtual destructor or a protected non-virtual destructor
The reason is that you cannot control all of the uses, and that simple rule means that the compiler will flag if you try to delete
through the wrong level in the hierarchy. Consider that shared_ptr
does not guarantee that it will call the appropriate destructor, only that it will call the destructor of the static type that was used as argument:
base* foo();
shared_ptr<base> p( foo() );
If base
has a public non-virtual destructor and foo
returns a type that derives from base
, then shared_ptr
will fail to call the correct destructor. If the destructor of base
is virtual, everything will be fine, if it is protected, the compiler will tell you that there is an error there.
来源:https://stackoverflow.com/questions/6634730/is-a-virtual-destructor-needed-for-your-interface-if-you-always-store-it-in-a-s