好吧,我只是在学习内存泄漏。我运行 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
循环中调用该函数,则在下次运行循环之前,应该使用 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.
}
您正在返回一个
new
双倍...什么时候释放?你会在某个时候打电话给delete
......对吗?
就我个人而言,我建议仅返回非零表示成功,返回零表示失败,并将该值放入
double *
(或 double &
)参数中。这样你就根本不需要担心new
。
您返回一个新分配的
double
。你删除它吗?
为什么要返回指向新分配的
double
的指针?为什么不直接返回 double
呢?返回一个八字节的临时值并不是什么大问题,调用者可以决定用它做什么(包括在堆上分配一个新的double
,如果愿意的话)。假设这些值不大,我宁愿返回一个临时值。使 new
在概念上更接近实际使用,使内存管理变得更容易。
此外,分配大量非常小的块可能会导致堆使用效率低下和堆碎片,因此程序可能会耗尽内存,否则程序可能会耗尽内存,并且即使看起来也可能无法分配大块就像还剩下很多一样。这可能重要,也可能无关紧要(分配内存所需的额外时间可能重要,也可能无关紧要,尤其是在运行时间可能由 I/O 主导的函数中)。这可能是微观优化,但如果没有充分的理由进行如此小的分配,您最好养成不使用它们的习惯。