如何通过运算符=在shared_ptr中释放内存



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

1.拥有该对象的最后剩余的shared_ptr被销毁;2.通过运算符=或reset((为拥有该对象的最后一个剩余shared_ptr分配另一个指针。

但是当我尝试执行一个示例程序时

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->区域((。请解释一下这是怎么发生的?

2.通过运算符=或reset((为拥有对象的最后一个剩余shared_ptr分配另一个指针。

是。

;P2=P1";分配给P1的内存必须被解除分配,对吗?

否。如果P2指向某个东西,则可能发生这种情况。不是P1

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

您所学到的关于销毁共享指针的知识是正确的。但在这里,你并没有破坏P1。而是将P1分配给P2shared_ptr的实现有一个重载的复制分配运算符,允许此操作并使其正确。

通过这个重载的实现,P2现在是一个共享指针,指向与P1相同的对象——两个指针都访问同一个对象,因此打印的区域相同。它们都以有效状态存在,正如您所看到的,管理Rectangle对象的指针数为2。

定义重载的=shared_ptr的概念一致——有多个指针指向(由于(同一对象。如果你想看到一个对比的实现,可以查找unique_ptr——这是一个智能指针,它假设只有一个指针拥有对象的所有权。它还有一个重载的赋值运算符,但使用它会使P1无效(据我所知,它会将其设置为nullptr,因此它仍然处于有效状态,只是不指向任何东西(。CCD_ 15将是CCD_ 16的唯一所有者。值得尝试,以便更好地理解。

您可以在此处找到有关shared_ptr功能的更多信息。

最新更新