C++ 共享PTR和三人法则

C++ 共享PTR和三人法则,c++,arraylist,shared-ptr,C++,Arraylist,Shared Ptr,我正在继续我对这些主题的理解过程,我想尝试将我的知识实际运用到我之前创建的一个名为ArrayList的类上,该类在创建类时创建的原始数组填满时动态分配内存。这就是我的类(部分)的样子:[我想大部分代码本身并不重要,我只是展示我所拥有的。问题的重点是毕竟代码] 下面是一些函数,它们负责向数组中添加元素,并在数组被填满时重新分配内存。append函数可能看起来有点奇怪,因为我试图将元素按升序排列,但这一部分并不重要 现在我已经发布了一个比预期占用更多空间的类,下面是我的问题: 我将如何在这个类中使用

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

下面是一些函数,它们负责向数组中添加元素,并在数组被填满时重新分配内存。append函数可能看起来有点奇怪,因为我试图将元素按升序排列,但这一部分并不重要

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

我将如何在这个类中使用共享的PTR?我知道共享的\u ptr可以更轻松地管理动态分配的资源,但是在这种情况下,共享的\u ptr是否可以用于创建原始数组,以及在将指向数组的指针分配给新数组时自动删除旧数组?我知道我将如何做到这一点,但这将对三原则产生什么影响(我读到,如果你使用共享的ptr,基本上不需要三原则)。我几乎觉得..在这种情况下,使用共享ptr有两个方面;一个用于实际为对象本身分配和释放资源,另一个用于创建新对象并将原始对象的数组复制到第二个对象中……如果这有意义?我猜我会这么做的

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

除了它自己做析构函数、复制构造函数和复制赋值操作符的工作之外?抱歉,如果这一切都让人困惑和冗长,但我只是…困惑。

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

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

delete [] arr;
arr = new int[that.size];
对于这样简单的事情:

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

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

…啊,我想我知道发生了什么。在我真正尝试应用我的知识之前,我可能已经阅读了关于unique_ptr的部分。因此,在本例中,我将使用unique_ptr,因为我不希望两个不同的对象指向同一内存[数组](这就是我执行所有复制控制功能的原因)。因此,使用unique_ptr将允许我不必使用析构函数,并且我不需要复制构造函数或复制赋值运算符bc unique_ptr将为我移动它@Mario你还得复制你的东西。你不必担心释放你的内存,因为一旦你重置了指针或者它超出了范围,内存就被释放了。好吧,现在我有点困惑了。好的,假设我创建了我的ArrayList对象,向其中添加内容,等等,然后我想要另一个对象,在原始对象中包含数组的副本。如果第一个对象是AL,第二个对象是AL2,并且我想要初始化它,我仍然会执行ArrayList AL2(AL)。那么,独特的ptr从何而来?它会是这样的:唯一的(AL2)@Mario将这些托管指针视为与常规指针一样工作。唯一的区别是:您不必担心释放内存。好吧……假设我有一个非成员函数“void valueAt(ArrayList&obj)”……我传入一个ArrayList对象,并让它打印位置2处的值,例如……当对象作为参数传递时,新创建的obj现在的指针指向原始数组的副本。当函数结束时,obj超出范围,类析构函数释放内存。我如何使用unique\u ptr重新实现所有这些?或者你能给我一个好的例子,我可以用它吗@马里奥
arr.reset(new int[that.size]);