shared_ptrs和三个规则

时间:2013-11-18 00:48:15

标签: c++ arraylist shared-ptr

我正在继续理解这些主题的过程,我想尝试将我的知识实际用于我之前创建的一个名为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);

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

1 个答案:

答案 0 :(得分:1)

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

您不再需要在析构函数中删除arr,而是修改以下行:

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

就像这样简单:

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

这将释放前一个实例(如果有的话),然后取得新实例的所有权。