_BLOCK_TYPE_IS_VALID(pHead->nBlockUse

誤操作:釋放棧上空間

錯誤現象:

 

刪除棧上空間報紅框

原因:

從框中內容能大概看出: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只能刪除堆上內存, 棧上的內存, 是不需要手動來釋放的, 因此, 程序會說內存塊的類型不對.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章