新聞中心
- C++異常
- 相關(guān)簡(jiǎn)化代碼
- 問題分析
- 解決方法
今天用VS開發(fā)調(diào)試時(shí),遇到崩潰異常,VS彈窗提示:0x0000xxx處有未經(jīng)處理的異常: 0xC0000XXX: 堆已損壞。調(diào)查發(fā)現(xiàn)是指針管理問題,現(xiàn)記錄如下:
相關(guān)簡(jiǎn)化代碼出問題代碼
.
// 定義了一個(gè)結(jié)構(gòu)體
// 為了兼容多個(gè)工程,使用純C接口,對(duì)外公開
struct ATTR_T
{char* strPath;
ATTR_T()
{strPath = nullptr;
}
~ATTR_T
{if(strPath)
{ delete strPath;
strPath = nullptr;
}
}
}
// 定義一個(gè)復(fù)合結(jié)構(gòu)體
// 工程內(nèi)部使用,不對(duì)外公開
struct PRIVATE_ATTR_T
{std::string strPath;
// 問題出在這里
PRIVATE_ATTR_T(ATTR_T stTemp)
{strPath = stTemp.strPath == NULL ? "" : stTemp.strPath;
}
}
// 主程序
ATTR_T a;
a.strTemp = new char[10];
PRIVATE_ATTR_T pa;
pa = a;
...
問題分析PRIVATE_ATTR_T pa構(gòu)造函數(shù)參數(shù)使用值傳遞方式傳入ATTR_T參數(shù)(比如ATTR_T a),等于PRIVATE_ATTR_T初始化的時(shí)候內(nèi)部會(huì)重新生成一個(gè)ATTR_T變量(ATTR_T b),ATTR_T的默認(rèn)拷貝構(gòu)造函數(shù)是淺拷貝,表示ATTR_T b的內(nèi)部成員strTemp和ATTR_T a的內(nèi)部成員strTemp指向的是同一個(gè)地址,在PRIVATE_ATTR_T pa構(gòu)造函數(shù)結(jié)束時(shí),會(huì)自動(dòng)調(diào)用ATTR_T b的析構(gòu)函數(shù),再主程序結(jié)束的時(shí)候,也會(huì)自動(dòng)調(diào)用ATTR_T a的析構(gòu)函數(shù),等于有一個(gè)地址存在重復(fù)釋放的情況,這時(shí)候程序就奔潰了。
解決方法針對(duì)本工程直接做法,構(gòu)造函數(shù)使用引用傳參,PRIVATE_ATTR_T(const ATTR_T& stTemp),保險(xiǎn)做法是ATTR_T的拷貝構(gòu)造函數(shù)重寫,用深拷貝實(shí)現(xiàn)。
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購,新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧
名稱欄目:C++奔潰異常-創(chuàng)新互聯(lián)
分享鏈接:http://www.ef60e0e.cn/article/ddjges.html