微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何通过 operator= 在 shared_ptr 中释放内存?

如何解决如何通过 operator= 在 shared_ptr 中释放内存?

我是 C++ 的初学者,我正在学习 shared_ptr 的概念。 我也明白了 多个 shared_ptr 对象可能拥有同一个对象,当发生以下任一情况时,该对象将被销毁并释放其内存:

1.最后剩余的拥有该对象的shared_ptr被销毁; 2.最后一个拥有该对象的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()。 请解释这是怎么发生的?

解决方法

你学到的关于销毁共享指针的知识是正确的。但在这里,您不是在破坏 P1。相反,您将 P1 分配给 P2shared_ptr 的实现有一个 overloaded copy assignment operator 允许此操作并使其正确。

通过重载实现,P2 现在是指向与 P1 相同的对象的共享指针 - 两个指针访问相同的对象,因此您打印的是相同的区域。它们都处于有效状态,如您所见,管理该 Rectangle 对象的指针数为 2。

定义重载的 =shared_ptr 的概念一致——有多个指针指向(欠)同一个对象。如果您想查看对比实现,请查找 unique_ptr - 这是一个智能指针,它假定只有一个指针拥有对象的所有权。它也有一个 overloaded assignment operator,但使用它会使 P1 无效(据我所知,它会将其设置为 nullptr,因此它仍然处于有效状态,只是不指向任何内容) . P2 将是 Rectangle 的唯一所有者。值得一试,以便更好地理解。

您可以在 shared_ptr 功能 here 上找到更多信息。

,

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

是的。

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

没有。如果 P2 指向某个东西,它可能会发生在 P1 上。不是{{1}}。

规则(2)背后的逻辑是赋值覆盖了第一个操作数的值,所以第一个操作数将不再指向它以前的值。如果它是指向某事物的最后一个指针,那么就不会再指向该指针,并且可以将其删除。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。