先來看下面的代碼
bool FuncTest(LPCTSTR lpcProc) { bool bRet = false; ... if (CONDITION1) { goto FUNC_CLEAN; } char* pchX = new char[100]; ... FUNC_CLEAN: if (NULL != pchX) { delete[]pchX; pchX = NULL; } return bRet; }
乍一看,沒有什么問題,但是程序偶發性崩潰了,分析dump信息發現dump中顯示崩潰的點出現在delete的地方。而指針是通過new申請的,使用delete釋放也沒問題呀,而且delete之前做了空指針判斷,按道理也不會有問題。
那么問題到底出在哪里呢?仔細觀察發現中間使用了goto,如果滿足了 【condition1】,那么就會直接跳轉到函數最后做清理動作,而跳過了指針 pchX本身的初始化,pchX的實際指向也就成了未知,直接去delete就很容易發生崩潰。
作者:耑新新,發布於 博客園
轉載請注明出處,歡迎郵件交流:zhuanxinxin@aliyun.com