2012-12-11 42 views
0

我現在很迷茫。我做了一個矢量類。一切工作,我希望它的工作,直到最後。當調用析構函數時,我收到一條錯誤消息:Debug assertion failed BLOCK_TYPE_IS_VALID(pHead-> nblockuse)。我看過不少這樣的問題,但我所嘗試過的並沒有奏效。調試斷言失敗BLOCK_TYPE_IS_VALID(pHead-> nblockuse)來自Deconstructor

.h的一部分。

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; 
} 
+3

關鍵的錯誤是在operator =()中,它應該創建數組的深層副本,而不僅僅是複製指針。因爲這會讓你刪除同一個數組兩次。 –

回答

5
_myArray = setterVect._myArray; 

你拷貝賦值運算符是壞了。在該運算符之後,兩個實例的值爲_myArray。所以一旦被破壞,另一個就留下一個指向不再存在的東西的指針。

而故事的寓意 - 使用std::vector

1

該錯誤意味着堆損壞。有很多方法可以破壞堆。 就像大衛上面解釋的那樣,釋放一塊內存然後寫入內存是一種方法。

大部分堆在您的大塊內存之前和之後存儲一些字節的簿記信息。如果您的代碼行爲異常並更改堆數據,則會出現此類錯誤。