2013-02-05 74 views
0

我該如何做這件事。返回分配的本地變量

char* ToString(int num) { 

    char* str = new char[len(num)]; 

    //conversion 

    return str; 

}

,並通過調用此。

string someStr = ToString(someInt); 

我應該在這裏免費得到someStr嗎?

我知道我總是需要delete每當我使用new

如果我多次調用這個函數,我該如何分配內存然後讓它們不使用它呢?

+0

爲什麼我總是得到否定的評價。我只是問 – mr5

+0

我沒有投票,但有一點需要注意的是,目前還不清楚你在'ToString'函數中做了什麼。另外,什麼是'len(int)'? – juanchopanza

+0

我們可以猜測 - 您使用的是char *而不是字符串,len(num)似乎很神祕,並且會泄漏內存。如果你的編譯器有一些C++ 11的支持,那麼已經有'std :: to_string'這可以正確地做到這一點。 –

回答

0

你是ToString函數應該返回一個std :: string,如果你只是把值賦給std :: string。沒有理由在這裏處理動態分配的內存。

1

對於每次撥打ToString時,您都需要撥打delete一次。您也無法使用分配的char數組初始化std::string,這與您的問題提示的方式相同 - 將泄漏返回的內存,而您的someStr變量已將其複製。

最簡單/最好的事情就是改變ToString而不是返回std::string。在這種情況下,當調用者的變量超出範圍時,字符串使用的內存將被自動刪除。

+0

要嘗試的數字位數。並告訴你什麼情況 – mr5

3

你應該完全避免這種做法。要麼返回std::unique_ptr,要麼直接處理std::string。從代碼中不清楚你想要做什麼,所以我不能提供具體的解決方案。

注意這個初始化:

string someStr = ToString(someInt); 

纔會正常,如果你返回一個空值終止字符串,但無論它泄漏資源工作。

請參閱this related post

0

someStr是副本。你已經泄漏了。您需要暫時保存返回的指針的值,並在構造字符串後對其進行取消。這通常是智能指針的工作。

編輯: 沒有,

char* temp = strs; delete [] str; return temp; 

將一些不確定的。但是:

char* temp =ToString(someInt); string someStr(temp);delete []temp; 

將工作。但這只是爲了讓你理解這個想法。如果你返回一個unique_ptr,這可以爲你做。而且我假設這是一種迴歸內存的普遍問題,在這種情況下必須是空閒的,在這種情況下,unique_ptrshared_ptr是一種解決方案。在這種情況下,你可以創建一個字符串,修改它並簡單地返回。所有的內存管理將由字符串類爲您提供。如果你真的只需要分配字符串中的「空間」,你可以這樣做:

String Str; Str.reserve(len(num)); 
+0

我可以這樣做:'char * temp = str'' delete [] str;''return temp;'??? – mr5

+0

@ mr5:不,請參閱編輯 – qPCR4vir

1

--leak-check=full跑下Valgrind的代碼,它報告num大小的內存泄漏。

調用new/deletenew [] /delete []成對是保持內存循環的唯一方法。

我不知道你想什麼做的,如果你想要的整數類型轉換爲字符串,C++有幾個選項:

// std::to_string(C++11) e.g: 
{ 
    std::string str = std::to_string(num) 
} 
// std::stringstream  e.g: 
{ 
    std::string str; 
    std::stringstream ss; 
    ss << num; 
    ss >> str; 
} 
// boost::lexical_cast e.g: 
{ 
    std::string str = boost::lexical_cast<std::string>(num); 
} 
// itoa(c function) 
{ 
    char buf[MAX_INT_DIGITS]; // MAX_INT_DIGITS == 12 ("-2147483648\0") 
    itoa(num, buf, 10); 
    std::string str(buf); 
} 
+0

我從itoa()派生了我的ToString()函數,但它需要堆棧內存,我不想分配太多或更少的內存。 – mr5

+0

我嘗試刪除它的內部和外部的範圍,但得到了一個rt錯誤。 '字符*海峽=的ToString(2);' '刪除[] STR;' 這 '字符*溫度= STR;' '刪除[] STR;' '返回temp;' – mr5

+0

不,你刪除它,那麼你不能返回無效的內存。並且你不能從iota派生你的功能 – billz