删除shallow的复制对象和origin对象

delete shallow's copy object and the origin object

我有一个 class 向量,其属性为:

class Vector
{
    private:
        int _capacity;
        int _size; 
        int _resizeFactor; 
        int* _elements;

用这个方法:

Vector::Vector(const Vector& other)
{
    this->_size = other._size;
    this->_capacity = other._capacity;
    this->_resizeFactor = other._resizeFactor;
    delete[] this->_elements;
    this->_elements = other._elements;
}

和这个析构函数:

Vector::~Vector()
{
    if (this->_elements) 
        delete[] this->_elements;
    this->_elements = NULL;
}

声明对象后,向其插入数组并复制它,在程序结束时,出现错误:

1.exe has triggered a breakpoint.

that points to the line:

   delete[] this->_elements;

in the destructor.

我怎样才能只取消其中一个对象的销毁? 不改变属性类型

您需要进行深层复制或沿引用计数实施某些操作,并且仅在删除引用相同数据的 Vector 的最后一个实例时才删除 elements

在你的复制构造函数中你不应该delete任何东西,因为在你调用

的地方
delete[] this->_elements;

elements 还没有指向任何东西。分配内存是构造函数的工作(或者如果你真的希望它指向 other->elements)。

首先,delete[] this->_elements; 似乎毫无意义,因为 this->_elements 尚未在复制构造函数中初始化。

要实现浅拷贝,你需要使用引用计数来记录有多少对象引用了数据,这样你就不会删除同一个数组两次(就像你现在在代码中所做的那样)。

我建议使用 std::shared_ptr,它已经为您实现了引用计数。为此,请将 int* 替换为 std::shared_ptr<int>。请注意 std::shared_ptr 不会自动支持数组,因此您需要自己提供自定义删除器:this->_elements=std::shared_ptr<int> (new int[100], [](int *p){delete[] p;});。然后,std::shared_ptr 将为您处理内存管理。