如何解决如何通过 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
分配给 P2
。 shared_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 举报,一经查实,本站将立刻删除。