最近在工作中,寫一計(jì)算桿塔絕緣子中心點(diǎn)的GPS坐標(biāo)程序時(shí),定義了一結(jié)構(gòu),里面用到了string類型來存儲(chǔ)桿塔所屬線路號(hào)、桿塔號(hào),桿塔模型名稱。代碼如下:
1
/*
2
@brief 桿塔信息結(jié)構(gòu)
3
*/
4
typedef struct _TOWER_INFO
5

{
6
string strLineNo; ///< 線路號(hào)
7
string strTowerNo; ///< 桿塔號(hào)
8
string strTowerType; ///< 桿塔類型
9
double dDangDistance; ///< 檔距
10
double dHCHeight; ///< 呼稱高
11
double dLongitude; ///< 經(jīng)度
12
double dLatitude; ///< 緯度
13
double dAltitude; ///< 海拔高度
14
double dLineCorners; ///< 線路轉(zhuǎn)角
15
long lCornerDirection; ///< 左轉(zhuǎn)還是右轉(zhuǎn): 0不轉(zhuǎn), 1左轉(zhuǎn), 2右轉(zhuǎn)
16
vector<INSULATOR_INFO::CENTER_POINT_INFO> vecInsulatorCenterPointInfo; ///< 桿塔所有絕緣子中心點(diǎn)信息
17
_TOWER_INFO()
{ memset(this, 0, sizeof(_TOWER_INFO)); } //該行代碼可能會(huì)引起string內(nèi)存泄露
18
19
}TOWER_INFO,*PTOWER_INFO; 在后面對(duì)該結(jié)構(gòu)的string型變量有賦值操作, 代碼如下
1
......
2 TOWER_INFO cur_tower_center_info;
3
cur_tower_center_info.strLineNo = sheetLine->Cell(i, 2)->GetText(); //調(diào)度碼
4
cur_tower_center_info.strTowerNo = sheetLine->Cell(i, 7)->GetText(); //桿塔號(hào)
5
cur_tower_center_info.strTowerType = sheetLine->Cell(i, 8)->GetText(); //桿塔類型
6 ...... 運(yùn)行程序,待程序結(jié)束后,發(fā)現(xiàn)有內(nèi)存泄露,提示信息如下
1
Detected memory leaks!
2
Dumping objects ->
3

{235250} normal block at 0x01774A60, 16 bytes long.
4
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
5

{235237} normal block at 0x01774CB0, 16 bytes long.
6
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
7

{235234} normal block at 0x01774A10, 16 bytes long.
8
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
9

{235184} normal block at 0x01774200, 16 bytes long.
10
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
11

{235171} normal block at 0x01774450, 16 bytes long.
12
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
13

{235168} normal block at 0x017741B0, 16 bytes long.
14
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
15

{235118} normal block at 0x017739A0, 16 bytes long.
16
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
17

{235105} normal block at 0x01773BF0, 16 bytes long.
18
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
19
.. 經(jīng)過一番源代碼跟蹤調(diào)試后,發(fā)現(xiàn)原因在于TOWER_INFO結(jié)構(gòu)體的構(gòu)造函數(shù)內(nèi)調(diào)用了memset(this, 0, sizeof(_TOWER_INFO);使得string內(nèi)部指針_Bx._Ptrr值為0,_Myres為0,在這種情況下當(dāng)string對(duì)象被賦值為小字符串(字節(jié)數(shù)包括結(jié)束符小于等于16的字符串)時(shí),因新申請(qǐng)的內(nèi)存在后來得不到釋放,所以這塊內(nèi)存被泄露了,根據(jù)string類內(nèi)存管理算法(ms vc版本)得知這塊內(nèi)存大小總是16個(gè)字節(jié).但當(dāng)被賦值為大字符串(字節(jié)數(shù)包括結(jié)束符大于16的字符串)時(shí),反而沒有內(nèi)存泄露,這是因?yàn)樾律暾?qǐng)的內(nèi)存在析構(gòu)或下次賦值時(shí)總能被釋放.
從該泄露問題的分析解決過程中,總結(jié)得到規(guī)律:不要輕易零初始化string, vector等stl標(biāo)準(zhǔn)容器及具有動(dòng)態(tài)內(nèi)存管理的類。
posted on 2009-08-07 01:31
春秋十二月 閱讀(7733)
評(píng)論(19) 編輯 收藏 引用 所屬分類:
C/C++