shared_ptr中的operator=?如何释放内存?

3

我是一个C++初学者,我正在学习shared_ptr的概念。 我也明白了以下几点: - 几个shared_ptr对象可以拥有同一个对象。 - 当以下任一情况发生时,对象将被销毁并且其内存将被释放: - 拥有该对象的最后一个remaining shared_ptr被销毁。 - 拥有该对象的最后一个remaining shared_ptr通过operator=或reset()分配给另一个指针。 但是当我尝试执行一个示例程序时:

     class Rectangle { 
        int length; 
        int breadth; 

        public: 
            Rectangle(int l, int b) 
            { 
              length = l; 
              breadth = b; 
            } 

            int area() 
            { 
                return length * breadth; 
            } 
          }; 

          int main() 
         { 

              shared_ptr<Rectangle> P1(new Rectangle(10, 5)); 
              cout << P1->area() << endl; 

              shared_ptr<Rectangle> P2; 
              P2 = P1;  //how is this possible 

             // This'll print 50 
             cout << P2->area() << endl; 

             // This'll now not give an error, 
             cout << P1->area() << endl; 
             cout << P1.use_count() << endl; 
             return 0; 
            } 

在执行“P2=P1”后,分配给P1的内存必须被释放,对吗? 但是我们仍然可以打印出P1->area()。 请解释这是如何发生的?

2个回答

3

2. 最后一个拥有该对象的shared_ptr通过operator=或reset()被赋予另一个指针。

是的。

"P2=P1"之后,分配给P1的内存必须被释放,对吗?

不对。如果P2指向某个东西,那么它可能会发生这种情况。但不会发生在P1身上。

规则(2)背后的逻辑是,赋值操作将覆盖第一个运算数的值,因此第一个运算数将不再指向原来的位置。如果它是指向某个对象的最后一个指针,那么没有任何东西会指向该对象,它可以被删除。


1
你学到的有关共享指针销毁的内容是正确的。但是在这里,你没有销毁 P1。相反,你将 P1 赋值给了 P2shared_ptr 的实现具有重载的复制赋值运算符,允许进行此操作并使其正确。
通过该重载实现,P2 现在是一个指向与 P1 相同对象的共享指针 - 两个指针都访问相同的对象,因此你正在打印相同的区域。它们都处于有效状态,正如你所看到的,管理那个 Rectangle 对象的指针计数为 2。
定义重载的=shared_ptr的概念相一致——有多个指针指向(拥有)同一个对象。如果您想看到对比实现,请查找unique_ptr——这是一个智能指针,假定只有一个指针拥有该对象。它也有重载的赋值运算符,但使用它会使P1无效(据我所知,它将其设置为nullptr,因此仍处于有效状态,但不指向任何内容)。P2将是Rectangle的唯一所有者。尝试一下,以获得更好的理解。
您可以在此处了解更多关于shared_ptr功能的信息。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接