class TClass
{
class EmbeddClass
{
public:
....
protected:
virtual ~EmbeddClass() {}
}
boost::scoped_ptr<EmbeddClass> scpEmbeddClass;
}
vs2010抱怨上面的代码。我可以通过将~EmbeddClass
定义为公共函数来解决问题。
问题&GT;这个问题的原因是什么?是因为scoped_ptr的析构函数无法访问受保护的~EmbeddClass
?在我看来,shared_ptr没有这样的问题。
谢谢
答案 0 :(得分:1)
问题&GT;这个问题的原因是什么?是因为scoped_ptr的析构函数无法访问受保护的~EmbeddClass?
是的,这正是问题所在。
在我看来,shared_ptr没有这样的问题。
我只能假设您没有存储EmbeddClass
个对象,而是存储shared_ptr
中从中派生的类型的对象。在这种情况下,共享指针的构造函数将创建一个 deleter ,它将调用派生类型最多的析构函数(如shared_ptr
构造函数/ reset()
/所示。 )。因为即使类型提到基类,shared_ptr
也会销毁派生类型最多的类型,但它不会调用基础析构函数。
答案 1 :(得分:0)
是因为scoped_ptr的析构函数无法访问受保护的 ~EmbeddClass?
是
在我看来,shared_ptr没有这样的问题。
请注意,您可以拥有多个shared_ptr
拥有资源,如果您没有初始化它或者使用次数超过1,则永远不需要调用删除器。但是,scoped_ptr
更像unique_ptr
,它在资源上具有唯一所有权,并确保即使您不初始化它也可以删除指针。
基本上,shared_ptr
和scoped_ptr
确实需要访问时,不拥有资源的unique_ptr
不需要访问受保护的析构函数。