2014-03-31 76 views
0

我爲未來傳遞給strcpystrcat的線程生成了一個大字符。一切都還好,直到我需要用一個字符串中的所有空格替換逗號。我搜索瞭解決這個here嘗試替換字符串中的字符時發生內存泄露

問題是,現在我有一個內存泄漏和與此消息的程序退出:

_Dumping objects -> 
{473} normal block at 0x0091E0C0, 32 bytes long. 
Data: <AMLUH UL619 BKD > 41 4D 4C 55 48 20 55 4C 36 31 39 20 42 4B 44 20 
{472} normal block at 0x049CCD20, 8 bytes long. 
Data: <  > BC ED 18 00 F0 EC 18 00 
{416} normal block at 0x082B5158, 1000 bytes long. 
Data: <Number of Aircra> 4E 75 6D 62 65 72 20 6F 66 20 41 69 72 63 72 61 
{415} normal block at 0x04A0E200, 20 bytes long. 
Data: <    > 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
{185} normal block at 0x049DA998, 64 bytes long. 
Data: < O X8 8  > DC 4F BB 58 38 C5 9A 06 38 D3 88 00 00 00 00 00 
PythonPlugin.cpp(76) : {172} normal block at 0x0088D338, 72 bytes long. 
Data: < a X F <)  > DC 61 BB 58 18 BB 46 06 3C 29 8A 06 CD CD CD CD 
Object dump complete._ 

下面的代碼,所以你可以告訴我,我做錯了什麼:

問題的代碼:

char* loop_planes(ac){ 

char *char1=new char[1000]; 
    for(...){ 
     strcpy(char1,"Number of Aircrafts\nHour of simulation\n\n"); 
     string tmp2=fp.GetRoute(); 
     tmp2.replace(tmp2.begin(),tmp2.end()," ",","); #PROBLEM IS IN THIS LINE 

     const char *tmp3=tmp2.c_str(); 
     strcat(char1,tmp3); 

    } 
return char1; 
} 

fp.GetRoute()就像是一個字符串這樣的:AMLUH UL619 BKD UM748 RUTOL

而且,現在我正在談論的內存分配,我不想和內存泄漏任何未來的問題,所以當我應該deletechar1,知道線程會調用這個函數?

+0

我在你寫的'#線是在這條線'''看到沒有問題。 – PaulMcKenzie

+0

我都沒有,但這就是調試停止的地方 –

+0

從來沒有使用過「替換」 - 我認爲你的使用不符合這裏的任何原型:http://www.cplusplus.com/reference/string/string/replace/ – PaulMcKenzie

回答

4

當您致電std::string::replace時,最佳匹配是一個模板模板,其第三個和第四個參數是輸入迭代器。所以你傳遞的字符串文本被解釋爲範圍的開始和結束,當它們不是時。這導致未定義的行爲。

您可以通過使用該算法std::replace,而不是容易解決這個問題:

std::replace(tmp2.begin(),tmp2.end(),' ',','); 

請注意這裏的第三個和第四個參數是單char秒。

+0

有一個與他的論點相匹配的過載,但它沒有做到他認爲的那樣,而且他使用它的方式是未定義的行爲。看到這個頁面上的第5個重載(不是編號爲5的那個):http://en.cppreference.com/w/cpp/string/basic_string/replace –

+0

@BenjaminLindley嗯,是的,在某些轉換後,某些內容會匹配。沒有完全匹配是我的意思。我試圖澄清這一點。 – juanchopanza

+0

雖然不存在從const char *到其他內容的轉換。它是一個模板函數。在輸入迭代器類型上進行模板化,在這種情況下推導爲'const char *'。 –

3

@juanchopanza的答案正確地識別並修復了原始問題,但由於您一般詢問了有關內存泄漏的問題,我還想建議您將功能替換爲不使用newdeletestrcpystrcat

std::string loop_planes() { 
    std::string res("Number of Aircrafts\nHour of simulation\n\n"); 
    for (...) { 
     std::string route = fp.GetRoute(); 
     std::replace(route.begin(), route.end(), ' ',','); 
     res += route; 
    } 
    return res; 
} 

這不需要任何明確的內存分配或刪除,也不會泄漏內存。我還冒昧地將退貨類型從char *更改爲std::string,以消除雜亂的轉換。

+0

非常好的回答隊友!但是爲我澄清一件事:'strcpy'和'strcat'也分配內存? –

+0

以及'std :: string res'在添加大量字符時不會有任何問題? –

+1

不,'strcpy'和'strcat'不分配內存,但它們要求程序的其餘部分在某處分配足夠的內存。如果分配了1000個字符並將1007個字符「strcat」放入其中,則會產生經典的緩衝區溢出。你可以分配2000字節,但你怎麼知道這總是足夠的?這些類型的問題很容易通過使用更持久的C++類來實現 - 在本例中爲'std :: string'。 – Edward