我是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
分配给P2
。shared_ptr
的实现有一个重载的复制分配运算符,允许此操作并使其正确。
通过这个重载的实现,P2
现在是一个共享指针,指向与P1
相同的对象——两个指针都访问同一个对象,因此打印的区域相同。它们都以有效状态存在,正如您所看到的,管理Rectangle
对象的指针数为2。
定义重载的=
与shared_ptr
的概念一致——有多个指针指向(由于(同一对象。如果你想看到一个对比的实现,可以查找unique_ptr
——这是一个智能指针,它假设只有一个指针拥有对象的所有权。它还有一个重载的赋值运算符,但使用它会使P1
无效(据我所知,它会将其设置为nullptr
,因此它仍然处于有效状态,只是不指向任何东西(。CCD_ 15将是CCD_ 16的唯一所有者。值得尝试,以便更好地理解。
您可以在此处找到有关shared_ptr
功能的更多信息。