Не удалось отладить утверждение BLOCK_TYPE_IS_VALID (pHead-> nblockuse) из деконструктора

Я совершенно потерян прямо сейчас. Я сделал векторный класс. Все работает так, как мне бы хотелось, чтобы все работало, до конца. Когда вызывается деструктор, я получаю сообщение об ошибке: Ошибка отладки BLOCK_TYPE_IS_VALID (pHead-> nblockuse). Я видел довольно много вопросов, подобных этому, на SO, но то, что я пробовал, не сработало.

часть .ч.

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

#include "File.h"
const string RETURN_CARRIAGE_STR = "\n";
const string SIZE_STR = "Size ";
const string CAPACITY_STR = "Capacity ";
const int INITIAL_CAPACITY = 2;

int main(void)
{
cout << "\nCreating a vector Sam of size 4.";
MyVector sam( 4 );

cout << "\nPush 12 values into the vector.";
for (int i = 0; i < 12; i++)
sam.push_back(i);

cout << "\nHere is sam: ";
cout << sam;
cout << "\n---------------\n";

cout << "\nCreating a vector Joe of size 4.";
MyVector joe( 4 );
cout << "\nPush 6 values into the vector.";
for (int i = 0; i < 6; i++)
joe.push_back(i * 3);

cout << "\nHere is joe: ";
cout << joe;
cout << "\n---------------\n";

cout << "\nTest the overloaded assignment operator \"joe = sam\": ";
joe = sam;cout << "\nHere is sam: ";
cout << sam;
cout << "\n---------------\n";

cout << "\nHere is joe: ";
cout << joe;
cout << "\n---------------\n";

// pass a copy of sam by value
PrintV(sam);

cout << endl;
system("PAUSE");
}

void PrintV(MyVector v)
{
cout << "\n--------------------\n";
cout << "Printing a copy of a vector\n";
cout << v;
}

// Default Constructor
MyVector::MyVector()
{
_myArray = new int[INITIAL_CAPACITY];
_size = 0;
_capacity = INITIAL_CAPACITY;
//cout << "Default Constructor" << endl;
}

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

//cout << "Parameterized Constructor" << endl;
}

MyVector::~MyVector()
{
if(_myArray != NULL)
{
delete[] this->_myArray; //  --------------This is where I get an error
this->_myArray = NULL;
}

//cout << "Destructor" << endl;
}int MyVector::GetSize()
{
return _size;
//cout << " size";
}

int MyVector::GetCapacity()
{
return _capacity;
//cout << _capacity << " capacity" << endl;
}

void MyVector::Clear()
{
int* resize_arr = new int[INITIAL_CAPACITY];
delete[] _myArray;
_myArray = resize_arr;
_capacity = INITIAL_CAPACITY - 1;
_size = 0;
}

void MyVector::push_back(int newValue)
{
if(_size < _capacity)
{
_myArray[_size] = newValue;
}
else  {
int* resize_arr = new int[_capacity*2];
for(int i = 0; i <= _size; i++)
resize_arr[i] = _myArray[i];

resize_arr[_size] = newValue;
delete[] _myArray;
_myArray = resize_arr;
_capacity = _capacity * 2;
}
_size++;
//cout << _size << " size" << endl;
}

int MyVector::at(int idx)
{
return _myArray[idx];
//cout << _myArray[idx] << " value at index" << endl;
}

ostream& operator<<(ostream& os, MyVector& vec)
{
ostringstream convert;
ostringstream convertCap;
convert << vec.GetSize();
string sizeConverted = convert.str();
convertCap << vec.GetCapacity();

string capConverted = convertCap.str();
string firstTemp = "";
firstTemp = SIZE_STR + sizeConverted  + RETURN_CARRIAGE_STR + CAPACITY_STR + capConverted + RETURN_CARRIAGE_STR;

for(int idx = 0; idx < vec.GetSize(); idx++)
{
string secondTemp = "";
ostringstream convertSize;
convertSize << vec.at(idx);
string vecAtIdx = convertSize.str();
secondTemp = vecAtIdx + RETURN_CARRIAGE_STR;
cout << secondTemp;
}

os <<  firstTemp;
return os;
}

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

//MyVector* mPtr = new MyVector();

_myArray = setterVect._myArray;
_capacity = setterVect._capacity;
_size = setterVect._size;

return *this;
}

0

Решение

_myArray = setterVect._myArray;

Ваш оператор присваивания копии поврежден. После этого оператора оба экземпляра имеют одинаковое значение для _myArray, Поэтому, как только один уничтожается, у другого остается указатель на то, что больше не существует.

А мораль этой истории — использовать std::vector,

5

Другие решения

Ошибка означает повреждение кучи. Есть много способов испортить кучу.
Как Дэвид объяснил выше, освободить часть памяти и затем написать ее одним из способов.

Большинство кучи хранят некоторые байты бухгалтерской информации до и после вашего куска памяти. Если ваш код плохо себя ведет и изменяет данные кучи, вы получаете этот тип ошибки.

1

По вопросам рекламы [email protected]