删除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
将为您处理内存管理。
我有一个 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
将为您处理内存管理。