2013-12-11 61 views
1

目前正在處理一些在Win XP和Win 7上調試Env的代碼。但是它在與堆損壞相關的版本中失敗了。非常感謝您的幫助。新字符後堆損壞[strlen

char *strr = NULL; 
if (SomeValue!= NULL) 
{ 
     while(SomePos != NULL) 
    { 
     CString strTemp; double SomeAmount; 

     strTemp.Format("%f",SomeAmount); 

     strr = new char[strlen((LPCTSTR)strTemp + 1)]; 
     strcpy(strr,LPCTSTR(strTemp)); 

     if(strr) 
     { 
      strr = NULL; 
      delete[] strr; 
     } 

    } 
} 

看這個我可以找出我缺少一些東西在刪除字符指針。

+2

您應該在nulling strr之前刪除。 – Moberg

+1

除了添加bug之外,在刪除它之前將'strr'設置爲'NULL'會給你一個內存泄漏。可以刪除一個空指針,所以你不需要測試。 – molbdnilo

回答

11

你的圓括號在錯誤的地方。你打算寫:

strlen((LPCTSTR)strTemp) + 1 

因此,你將分配一個緩衝區,它需要是兩個字符。

這將使使用GetLength()方法更有意義:

strr = new char[strTemp.GetLength() + 1)]; 

而這種代碼顯然是錯誤的:

strr = NULL; 
delete[] strr; 

當然,你不能指望在NULL使用delete[]

+0

感謝您的幫助。 strlen((LPCTSTR)strTemp)+1已幫助 – WENzER

+0

如果我是你,我會避免strlen。在這裏使用是錯誤的。爲什麼新的而不是std :: vector? –

+0

我在另一個函數中使用這個strr,它返回一個字符指針來格式化字符串。 – WENzER

7

我想你的意思是:

strr = new char[strlen((LPCTSTR)strTemp) + 1]; 

此+1是 '\ 0' 吧?