誤操作:釋放棧上空間 Expression: _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)

pamxy發表於2013-04-28

轉自:http://blog.csdn.net/woyaowenzi/article/details/5479367


誤操作:釋放棧上空間

錯誤現象:

 

刪除棧上空間報紅框

原因:

從框中內容能大概看出:Expression: _BLOCK_TYPE_IS_VALID(pHead->nBlockUse), 說明是記憶體塊的型別不對, 什麼情況下會有這種問題呢? 試驗一下, 請看下面程式碼:

  1. void test(vector<int*>* vecptr)  
  2. {  
  3.     if (vecptr != NULL)  
  4.     {  
  5.         int nSize = vecptr->size();  
  6.         for (int nIndex = 0; nIndex < nSize; ++nIndex)  
  7.         {  
  8.             delete vecptr->at(nIndex);  
  9.             vecptr->at(nIndex) = NULL;  
  10.         }  
  11.         delete vecptr;  
  12.         vecptr = NULL;  
  13.     }  
  14. }  

呼叫程式碼:

  1. vector<int*> vec;  
  2. int* ptr = NULL;  
  3. for (int nIndex = 0; nIndex < 5 ; nIndex++)  
  4. {  
  5.     ptr = new int;  
  6.     *ptr = nIndex;  
  7.     vec.push_back(ptr);  
  8.     ptr = NULL;  
  9. }  
  10. test(&vec);  

我們看到, vec這個變數是在棧上申請的, 是臨時的, 當傳入test函式之後, 依次釋放vector中的指標, 這是沒有問題的, 但是, 在最後一步,我們將vector本身刪除掉了, 這時, 這個錯誤就蹦出來了. 其原因很明顯, delete只能刪除堆上記憶體, 棧上的記憶體, 是不需要手動來釋放的, 因此, 程式會說記憶體塊的型別不對.


相關文章