C++ 内存泄漏!如何修复?

C++ 内存泄漏!如何修复?,c++,memory-leaks,valgrind,C++,Memory Leaks,Valgrind,好的,我只是在学习内存泄漏。我运行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)

好的,我只是在学习内存泄漏。我运行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
解除分配返回值,以避免内存泄漏


如果您在
的同时调用
循环中的函数,则在下次运行循环之前,必须使用
delete
取消分配
number
。仅使用
delete
一次将仅取消分配最后一次获取的源

编辑:


您正在返回一个
new
double。。。什么时候释放?您可以在某个时候调用
delete
。。。对吧?


就个人而言,我建议成功时返回非零,失败时返回零,并将值放入
double*
(或
double&
)参数中。这样,您根本不需要为
new
操心。

您将返回一个新分配的
double
。你把它删除了吗

为什么返回指向新分配的
双精度
的指针?为什么不直接返回一个
double
?返回一个8字节的临时值并不是什么大问题,调用者可以决定它想用它做什么(包括在堆上分配一个新的
double
)。假设值不大,我宁愿返回一个临时值。使
在概念上更接近实际使用,使内存管理更容易


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

好的……明白了。在我的函数main()中,我声明“double*number=NULL”。在while循环中,我调用“number=readInput(command);”,后跟基于“number”值的if/else语句。我不认为我可以删除if/else语句后的'number'而不产生坏结果,对吗?但是不删除它会导致每次通过while循环时内存泄漏,对吗?谢谢没有…只是尝试在我的main()中添加“delete number;”语句。它没有破坏程序或消除内存泄漏。
// ....

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.
}