内存泄漏!怎么解决?

问题描述 投票:0回答:3

好吧,我只是在学习内存泄漏。我运行 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()));
    }
}
c++ memory-leaks valgrind
3个回答
11
投票
// ...
   return new double(atof(in.c_str()));
// ...

new
从正在返回的免费商店获取资源。必须使用
delete
释放返回值以避免内存泄漏。


如果您在

while
循环中调用该函数,则在下次运行循环之前,应该使用
number
明确释放
delete
。仅使用
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.
}

3
投票

您正在返回一个

new
双倍...什么时候释放?你会在某个时候打电话给
delete
......对吗?

就我个人而言,我建议仅返回非零表示成功,返回零表示失败,并将该值放入

double *
(或
double &
)参数中。这样你就根本不需要担心
new


2
投票

您返回一个新分配的

double
。你删除它吗?

为什么要返回指向新分配的

double
的指针?为什么不直接返回
double
呢?返回一个八字节的临时值并不是什么大问题,调用者可以决定用它做什么(包括在堆上分配一个新的
double
,如果愿意的话)。假设这些值不大,我宁愿返回一个临时值。使
new
在概念上更接近实际使用,使内存管理变得更容易。

此外,分配大量非常小的块可能会导致堆使用效率低下和堆碎片,因此程序可能会耗尽内存,否则程序可能会耗尽内存,并且即使看起来也可能无法分配大块就像还剩下很多一样。这可能重要,也可能无关紧要(分配内存所需的额外时间可能重要,也可能无关紧要,尤其是在运行时间可能由 I/O 主导的函数中)。这可能是微观优化,但如果没有充分的理由进行如此小的分配,您最好养成不使用它们的习惯。

© www.soinside.com 2019 - 2024. All rights reserved.