【问题标题】:Deep copy int array c++深拷贝int数组C++
【发布时间】:2012-12-11 04:20:37
【问题描述】:

我想深拷贝一个 int 数组。当它通过析构函数时,我得到一个断言错误:_BLOCK_TYPE_IS_VALID(pHead->nBlockUse)。我被告知是因为它试图删除不存在的东西。请让我知道我是否走在正确的轨道上并且只需要更改一些小东西,或者如果我完全迷路并且不知道它。如果需要,我可以添加更多代码。

感谢您的回答。

.h

private:
    int* _myArray;
    int _size;
    int _capacity;

.cpp

MyVector::MyVector()
{
_myArray = new int[2];
_size = 0;
_capacity = 2;
}

MyVector::MyVector(int aSize)
{
_myArray = new int[aSize];
_size = 0;
_capacity = aSize;
}

 MyVector::~MyVector()
 {
if(_myArray != NULL)
{
    delete[] _myArray;
    _myArray = NULL;
}
 }
MyVector::MyVector(const MyVector& mVector)
{
_capacity = mVector._capacity;
_size = mVector._size;

//  if(mVector._myArray)
//  {
//  _myArray = new int[_capacity];

//  copy(mVector._myArray, mVector._myArray+_capacity, _myArray);
//  }
}

  MyVector& MyVector::operator=(MyVector& setterVect)
{
delete [] _myArray;

if(setterVect._myArray)
{
    _myArray = new int[_capacity];

    copy(setterVect._myArray, setterVect._myArray+_capacity, _myArray);
}

return *this;
}

【问题讨论】:

  • 你是否在默认构造函数中将_myArray初始化为NULL
  • 不,我只是从我的构造函数中添加了代码。我将其设置为 2。
  • 不久前,我写了一篇blog post,关于您可能会感兴趣的动态数组。

标签: c++ arrays memory-leaks deep-copy


【解决方案1】:

您需要确保您关注的是 "Rule of Three"

除了复制构造函数和析构函数之外,您还应该提供一个复制赋值运算符,它应该对动态分配的指针成员进行深度复制。

顺便说一句,最好的解决方案是简单地删除动态分配的成员并使用std::vector,这样可以省去手动管理内存的所有麻烦。

【讨论】:

  • 好的,是的,我意识到使用 std::vector 会更好。我只是想学习 C++ 中内存分配和指针等的整个概念。
  • 什么时候调用赋值运算符,什么时候调用复制构造函数?我刚刚添加了一个赋值运算符。那是我应该做的吗?
  • 这里有一个很好的article 解释何时调用赋值运算符和复制构造函数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-06
  • 1970-01-01
  • 2016-12-03
相关资源
最近更新 更多