内存泄漏!我怎样才能修好它呢?
Memory leak! How can I fix it?
好的,所以我只是在学习内存泄漏。我运行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
循环中调用函数,那么在下次运行循环之前,一定要使用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
double…什么时候释放?你做调用delete
在它的某个点…对吧?
就个人而言,我建议只返回非零表示成功,返回零表示失败,并将值放在double *
(或double &
)参数中。这样你就不需要为new
而烦恼了。
返回一个新分配的double
。你把它删除了吗?
为什么要返回一个指向新分配的double
的指针?为什么不返回一个double
?返回一个8字节的临时值并不是什么大问题,调用者可以决定如何处理它(包括在堆上分配一个新的double
,如果它喜欢的话)。假设值不大,我宁愿返回一个临时值。使new
在概念上更接近实际使用,使内存管理更容易。
此外,分配大量非常小的块可能会导致堆使用效率低下和堆碎片,因此程序可能会在内存不会耗尽的情况下耗尽内存,并且可能无法分配大块,即使看起来还有很多剩余。这可能很重要,也可能不重要(分配内存所需的额外时间可能很重要,也可能不重要,特别是在运行时间可能由I/O主导的函数中)。这可能是微优化,但如果没有很好的理由使用这么小的分配,您不妨养成不使用它们的习惯。
相关文章:
- C++功能泄漏内存,我是C++新手,不确定如何解决
- 我的堆栈弹出式磁带的实现是否泄漏内存?
- 将 c++ 向量转换为字符 ** 而不会泄漏内存
- 析构函数 C++ 使泄漏内存
- 构造函数对象赋值是否泄漏内存
- corba :: orb_init泄漏内存
- Gmock泄漏内存
- 如何在不泄漏内存的情况下删除链接列表
- Visual C ODBC关闭记录集泄漏内存
- 为什么泄漏内存比在动态数组上执行 delete[] 慢
- OpenGL正在泄漏内存.哪个对象未释放
- 可以std ::退出泄漏内存
- uiautomation findall泄漏内存
- 为什么在此OpenCL代码中泄漏内存,为什么要泄漏内存
- pthread在完成后会泄漏内存
- win32 标准::线程泄漏内存
- 返回指向同一变量的指针是否会泄漏内存
- 使用clectType(new any_type())可能会泄漏内存泄漏
- Windows开发:如何确定我的应用程序是否正在泄漏内存
- WinHttp打开泄漏内存