2
class TClass
{
    class EmbeddClass
    {
        public:
        ....

        protected:
            virtual ~EmbeddClass() {}

    }   

    boost::scoped_ptr<EmbeddClass> scpEmbeddClass;
}

vs2010 抱怨上面的代码。我可以通过将 定义~EmbeddClass为公共函数来解决问题。

问题> 这个问题的原因是什么?是因为 scoped_ptr 的析构函数无法访问 protected ~EmbeddClass吗?在我看来 shared_ptr 没有这样的问题。

谢谢

4

2 回答 2

1

问题> 这个问题的原因是什么?是因为 scoped_ptr 的析构函数无法访问受保护的 ~EmbeddClass 吗?

是的,这正是问题所在。

在我看来 shared_ptr 没有这样的问题。

我只能假设您不是在存储EmbeddClass对象,而是在shared_ptr. 在这种情况下,共享指针的构造函数将创建一个删除器,该删除器将调用最派生类型的析构函数(如shared_ptr构造函数 / reset()/.. 所示)。因为shared_ptr即使类型提到了基类,派生最多的类型也会被销毁,所以它不会调用基类析构函数。

于 2012-11-21T20:55:30.487 回答
0

是因为 scoped_ptr 的析构函数无法访问受保护的 ~EmbeddClass 吗?

是的。

在我看来 shared_ptr 没有这样的问题。

注意你可以有多个shared_ptr拥有一个资源,如果你不初始化它或者使用次数超过1,它永远不需要调用删除器。但是,scoped_ptr它更像是unique_ptr,它对资源拥有唯一的所有权,并确保即使您不初始化它也可以删除指针。

基本上,shared_ptr不拥有资源的 a 不需要访问受保护的析构函数,scoped_ptrunique_ptr确实需要访问。

于 2012-11-21T21:22:32.873 回答