誤操作:釋放棧上空間
錯誤現象:
原因:
從框中內容能大概看出:Expression: _BLOCK_TYPE_IS_VALID(pHead->nBlockUse), 說明是內存塊的類型不對, 什麼情況下會有這種問題呢? 試驗一下, 請看下面代碼:
- void test(vector<int*>* vecptr)
- {
- if (vecptr != NULL)
- {
- int nSize = vecptr->size();
- for (int nIndex = 0; nIndex < nSize; ++nIndex)
- {
- delete vecptr->at(nIndex);
- vecptr->at(nIndex) = NULL;
- }
- delete vecptr;
- vecptr = NULL;
- }
- }
調用代碼:
- vector<int*> vec;
- int* ptr = NULL;
- for (int nIndex = 0; nIndex < 5 ; nIndex++)
- {
- ptr = new int;
- *ptr = nIndex;
- vec.push_back(ptr);
- ptr = NULL;
- }
- test(&vec);
我們看到, vec這個變量是在棧上申請的, 是臨時的, 當傳入test函數之後, 依次釋放vector中的指針, 這是沒有問題的, 但是, 在最後一步,我們將vector本身刪除掉了, 這時, 這個錯誤就蹦出來了. 其原因很明顯, delete只能刪除堆上內存, 棧上的內存, 是不需要手動來釋放的, 因此, 程序會說內存塊的類型不對.