shared_ptrs和三法则

shared_ptrs and the rule of three

本文关键字:ptrs shared      更新时间:2023-10-16

我正在继续理解这些主题的过程,我想尝试将我的知识实际用于我之前已经创建的名为 ArrayList 的类,当创建类时创建的原始数组被填满时,它会动态分配内存。这就是我的类(部分)的样子:[我想大部分代码本身并不重要,我只是在展示我所拥有的。问题的重点是毕竟代码]

以下是负责向数组添加元素并在内存填满时重新分配内存的函数。追加函数可能看起来有点奇怪,因为我试图按升序放置元素,但那部分并不重要。

现在我已经发布了比预期占用更多空间的类,这是我的问题:

我将如何在此类中使用shared_ptrs?我知道shared_ptrs更容易管理动态分配的资源,但是在这种情况下,shared_ptr是否用于创建原始数组,并在将指向数组的指针分配给新数组时自动删除旧数组?我可以看到我将如何做到这一点,但这对三法则有什么影响[如果你使用shared_ptrs,我基本上不需要它]。我几乎觉得..在这种情况下,使用shared_ptr有两个维度;一个用于实际负责为对象本身分配和解除分配资源,但如果我想创建一个新对象并将原始对象的数组复制到第二个对象中,另一个也是如此......这是否有意义?我猜我会这样做

ArrayList AL(10);
shared_ptr<ArrayList> ptr = make_shared<ArrayList>(AL); 

这是否有效地做了与我所做的相同的事情

ArrayList AL(10);
ArrayList AL2(AL);

除了它自己完成析构函数、复制构造函数和复制赋值运算符的工作吗?对不起,如果这一切都令人困惑和漫长,但我只是...困惑。

我不会在你的情况下使用std::shared_ptr。由于总是只有一个所有者,我宁愿std::unique_ptr.它基本上以相同的方式工作,但它不会进行引用计数(因为始终只有一个所有者持有资源)。

您不再需要删除析构函数中的arr,并且需要修改以下行:

delete [] arr;
arr = new int[that.size];

像这样简单的事情:

arr.reset(new int[that.size]);

这将释放以前的实例(如果有),然后获得新实例的所有权。