有什么一般性质的技巧可以确保我在C++程序中不会泄漏内存? 我如何确定谁应该释放动态分配的内存?
有什么一般性质的技巧可以确保我在C++程序中不会泄漏内存? 我如何确定谁应该释放动态分配的内存?
如果您要手动管理内存,有两种情况:
如果您需要打破这些规则,请记录下来。
这一切都与指针所有权有关。
您可以拦截内存分配函数并查看程序退出时是否有一些未释放的内存区域(尽管这不适用于所有应用程序)。
也可以在编译时通过替换new和delete运算符以及其他内存分配函数来完成。
例如,在此网站 [调试C++中的内存分配]中检查。 注意:对于delete运算符也有类似的技巧:
#define DEBUG_DELETE PrepareDelete(__LINE__,__FILE__); delete
#define delete DEBUG_DELETE
您可以将文件名存储在某些变量中,当重载的删除运算符知道它被调用的位置时,就可以将其记录下来。这样,您就可以跟踪程序中的每个删除和分配操作。在内存检查序列的结尾,您应该能够报告哪些分配的内存块没有被“删除”,并通过文件名和行号进行标识,这也是您想要的。
您还可以尝试一些类似于Visual Studio下的BoundsChecker ,它非常有趣且易于使用。
关于在不同位置分配和销毁的唯一示例之一是线程创建(您传递的参数)。 但即使在这种情况下也很容易。 这是创建线程的函数/方法:
struct myparams {
int x;
std::vector<double> z;
}
std::auto_ptr<myparams> param(new myparams(x, ...));
// Release the ownership in case thread creation is successfull
if (0 == pthread_create(&th, NULL, th_func, param.get()) param.release();
...
在这里替换线程函数
extern "C" void* th_func(void* p) {
try {
std::auto_ptr<myparams> param((myparams*)p);
...
} catch(...) {
}
return 0;
}
param.release();
在主函数/方法中调用了什么?什么都没有!因为我们会“告诉”auto_ptr忽略释放。
C++内存管理很容易,不是吗?
干杯,
Ema!
管理内存的方式与您管理其他资源(句柄、文件、数据库连接、套接字等)的方式相同。垃圾回收也无法帮助您处理它们。
C ++ 的设计考虑了 RAII。我认为在 C ++ 中管理内存没有更好的方式。 但是要小心不要在本地作用域上分配非常大的块(例如缓冲对象)。这可能会导致堆栈溢出,并且如果在使用该块时边界检查存在缺陷,则可以覆盖其他变量或返回地址,从而导致各种安全漏洞。
任何函数都只返回一个值。这样你就可以在那里进行释放,而不会错过它。
否则很容易犯错误:
new a()
if (Bad()) {delete a; return;}
new b()
if (Bad()) {delete a; delete b; return;}
... // etc.