簡體   English   中英

內存泄漏! 怎么修?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM