[英]memory leak! how to fix?
好的,所以我只是在了解內存泄漏。 我跑valgrind找到內存泄漏。 我得到以下內容:
==6134== 24 bytes in 3 blocks are definitely lost in loss record 4 of 4
==6134== at 0x4026351: operator new(unsigned int) (vg_replace_malloc.c:255)
==6134== by 0x8048B74: readInput(char&) (in calc)
那么這肯定意味着泄漏是在我的readInput函數中嗎? 如果是這樣,我如何擺脫內存泄漏? 這是違規的功能:
double* readInput(char& command){
std::string in;
std::getline(std::cin, in);
if(!isNumber(in)){
if(in.length()>1){
command = 0;
}
else{
command = in.c_str()[0];
}
return NULL;
}
else{
return new double(atof(in.c_str()));
}
}
謝謝!
// ...
return new double(atof(in.c_str()));
// ...
new
從正在返回的免費商店獲取資源。 必須使用delete
釋放返回的值以避免內存泄漏。
如果您在while
循環中調用該函數, while
在下次運行循環之前,應使用delete
明確地取消分配number
。 只使用delete
一次只會釋放最后獲得的源。
編輯:
// ....
while( condition1 )
{
double *number = NULL ;
number = readInput(command) ;
if( condition2 )
{ .... }
else
{ .... }
delete number ; // Should be done inside the loop itself.
// readInput either returns NULL or a valid memory location.
// delete can be called on a NULL pointer.
}
你正在返回一個new
雙...什么時候被釋放了? 你調用delete
在某個點上,對吧?
就個人而言,我建議只返回非零表示成功,零表示失敗,並將值放在double *
(或double &
)參數中。 這樣你根本不需要打擾new
的東西。
你返回一個新分配的double
。 你在某個地方刪除它嗎?
為什么要返回指向新分配的double
的指針? 為什么不返回一個double
? 返回一個8字節的臨時值並不是什么大問題,並且調用者可以決定它想要用它做什么(包括如果喜歡的話在堆上分配一個新的double
)。 假設值不大,我寧願返回一個臨時值。 將概念上的new
概念更接近實際使用使得內存管理更容易。
此外,分配大量非常小的塊可能導致堆使用效率低下和堆碎片,因此程序可能會在內存不足的情況下耗盡內存,並且即使它看起來像也可能無法分配大塊剩下的還有很多。 這可能或不重要(分配內存所需的額外時間可能或可能無關緊要,尤其是在運行時間可能由I / O支配的函數中)。 這可能是微優化,但如果沒有充分的理由進行如此小的分配,你也可能養成不使用它們的習慣。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.