1

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;
}
4

1 に答える 1

4

「3 つのルール」に従っていることを確認する必要があります。

コピー コンストラクターとデストラクタとは別に、動的に割り当てられたポインター メンバーのディープ コピーを行うコピー代入演算子も提供する必要があります。

余談ですが、最善の解決策は、動的に割り当てられたメンバーを単純に削除し、std::vector手動でメモリを管理する手間を省くことができます。

于 2012-12-11T04:27:24.063 に答える