繁体   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