`
shi5jin
  • 浏览: 37257 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
社区版块
存档分类
最新评论

我应该怎样处理内存泄漏?

阅读更多
很 简单,只要写“不漏”的代码就完事了啊。显然,如果你的代码到处是new、delete、指针运算,那你想让它“不漏”都难。不管你有多么小心谨慎,君为 人,非神也,错误在所难免。最终你会被自己越来越复杂的代码逼疯的——你将投身于与内存泄漏的奋斗之中,对bug们不离不弃,直至山峰没有棱角,地球不再 转动。而能让你避免这样困境的技巧也不复杂:你只要倚重隐含在幕后的分配机制——构造和析构,让C++的强大的类系统来助你一臂之力就OK了。标准库中的 那些容器就是很好的实例。它们让你不必化费大量的时间精力也能轻松惬意地管理内存。我们来看看下面的示例代码——设想一下,如果没有了string和 vector,世界将会怎样?如果不用它们,你能第一次就写出毫无内存错误的同样功能代码吗?
	#include<vector>
#include<string>
#include<iostream>
#include<algorithm>
using namespace std;

int main() // small program messing around with strings
{
cout << "enter some whitespace-separated words:\n";
vector<string> v;
string s;
while (cin>>s) v.push_back(s);

sort(v.begin(),v.end());

string cat;
typedef vector<string>::const_iterator Iter;
for (Iter p = v.begin(); p!=v.end(); ++p) cat += *p+"+";
cout << cat << '\n';
}

请注意这里没有显式的内存管理代码。没有宏,没有类型转换,没有溢出检测,没有强制的大小限制,也没有指针。如果使用function object和标准算法[译注:指标准库中提供的泛型算法],我连Iterator也可以不用。不过这毕竟只是一个小程序,杀鸡焉用牛刀?

当然,这些方法也并非无懈可击,而且说起来容易做起来难,要系统地使用它们 也并不总是很简单。不过,无论如何,它们的广泛适用性令人惊讶,而且通过移去大量的显式内存分配/释放代码,它们确实增强了代码的可读性和可管理性。早在 1981年,我就指出通过大幅度减少需要显式加以管理的对象数量,使用C++“将事情做对”将不再是一件极其费神的艰巨任务。

如果你的应用领域没有能在内存管理方面助你一臂之力的类库,那么如果你还想让你的软件开发变得既快捷又能轻松得到正确结果,最好是先建立这样一个库。

如果你无法让内存分配和释放成为对象的“自然行为”,那么至少你可以通过使 用资源句柄来尽量避免内存泄漏。这里是一个示例:假设你需要从函数返回一个对象,这个对象是在自由内存堆上分配的;你可能会忘记释放那个对象——毕竟我们 无法通过检查指针来确定其指向的对象是否需要被释放,我们也无法得知谁应该负责释放它。那么,就用资源句柄吧。比如,标准库中的auto_ptr就可以帮 助澄清:“释放对象”责任究竟在谁。我们来看:

	#include<memory>
#include<iostream>
using namespace std;

struct S {
S() { cout << "make an S\n"; }
~S() { cout << "destroy an S\n"; }
S(const S&) { cout << "copy initialize an S\n"; }
S& operator=(const S&) { cout << "copy assign an S\n"; }
};

S* f()
{
return new S; // who is responsible for deleting this S?
};

auto_ptr<S> g()
{
return auto_ptr< S >(new S); // explicitly transfer responsibility for deleting this S
}

int main()
{
cout << "start main\n";
S* p = f();
cout << "after f() before g()\n";
// S* q = g(); // caught by compiler
auto_ptr< S > q = g();
cout << "exit main\n";
// leaks *p
// implicitly deletes *q
}

这里只是内存资源管理的例子;至于其它类型的资源管理,可以如法炮制。

如果在你的开发环境中无法系统地使用这种方法(比方说,你使用了第三方提供的古董代码,或者远古“穴居人”参与了你的项目开发),那么你在开发过程中可千万要记住使用内存防漏检测程序,或者干脆使用垃圾收集器(Garbage Collector)。

原文地址:http://www.research.att.com/~bs/bs_faq2.html#memory-leaks

分享到:
评论

相关推荐

    Android处理内存泄漏的代码例子

    Android处理内存泄漏的代码例子。用于演示避免内存泄漏的几种方法,包括:关闭游标、重用适配、回收图像、注销监听、释放引用。

    如何解决torch.tensor中的copy-方法造成的内存泄漏?

    python虽然不用主动管理内存,然而如果处理不当,会造成严重的内存泄露。比如在进行机器学习训练的过程中就会发生这种情况,导致程序难以长时间连续运行。本文给大家带来处理这类问题的一种处理思路。

    内存泄漏处理.doc

    曾经使用JAVA开发大型系统的网友恐怕都有过这种体会:系统运行一段时间后就抛出out of memory 异常,然后是艰难的内存泄漏问题排查。在一个大型的JAVA系统中,内存泄露问题是最难查找和解决的问题之一。因为从异常...

    用mtrace分析内存泄露

    对于嵌入式系统中运行的程序,一般来说程序启动的时候会分配很多内存,然后一直运行下去,不会显式释放这些内存,这部分内存并不会...这些内存有没有泄露,memwatch和dmalloc就不太适合这种处理,mtrace就比较合适。

    vc内存泄露检测

    C/C++ 编程语言的最强大功能之一便是其动态分配和释放内存,但是中国有句古话:“最大的长处也可能成为最大的弱点”,那么 C/C++ 应用程序正好印证...下面请和我一起分享收获——如何使用 CRT 调试功能来检测内存泄漏?

    论文研究-嵌入式软件内存泄露检测方法研究.pdf

    与桌面系统相比,嵌入式系统处理能力弱、内存空间小、运行时间长,如果在程序运行期间发生内存泄露,将导致系统崩溃,造成不可预料的后果,因此需要在开发调试阶段尽早检测出造成内存泄露的代码。提出了一种基于动态...

    Linux攻略:让系统内存不再泄漏的好方法

    内存泄漏指的是程序员动态分配了内存,但是在使用完成后却忘了将其释放。除了内存泄漏以外,在开发人员自己管理内存的开发中,缓冲溢出、悬摆指针等其它一些内存的问题也时有发生。现在已经有了一些实时监测内存问题...

    详细介绍Java的内存管理与内存泄露

    详细介绍Java的内存管理与内存泄露 作为Internet最流行的编程语言之一...这里与大家分享我们在开发过程中遇到的Java内存泄漏的检测和处理解决过程. 本文先介绍Java的内存管理,以及导致Java内存泄露的原因。 ........

    android 内存泄漏 摘抄

    android 的内存泄漏 和anr的处理情况,挺不错的资源

    处理bitmap内存溢出问题

    处理bitmap内存溢出问题

    VC使用CRT调试功能来检测内存泄漏.rar_VC 内存_VC 调试_Vc_内存泄漏

    VC使用CRT调试功能来检测内存泄漏 C/C++ 编程语言的最强大功能之一便是其动态分配和释放内存,但是中国有句古话:“最大的长处也可能成为最大的弱点”,那么 C/C++ 应用程序正好印证了这句话。在 C/C++ 应用程序...

    Android-WebView的封装获取标题获取图片js支持内存泄漏处理

    WebView的封装,获取标题,获取图片,js支持,内存泄漏处理

    解决python中显示图片的plt.imshow plt.show()内存泄漏问题

    主要介绍了解决python中显示图片的plt.imshow plt.show()内存泄漏问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

    图片过大引起的内存溢出解决方案

    使用BitmapFactory加载图片时,如果图片过大可能引起OutOfmemory溢出的问题。解决办法。

    内存泄漏和防范

    动态分配、回收内存是 C /C + +编程语言...一个最敏感和难检测的 BUGS 就是内存泄漏 — 没有把前边分配的内存成功释放 ,一个小的内存泄漏可能不会引起人的注意 ,但是程序泄漏大块内存 ,将可能引起复杂的内存耗尽错误。

    java内存泄露定位与分析[整理].pdf

    java内存泄露定位与分析[整理].pdf

    vld(Visual Leak Detector 内存泄露检测工具 源码)

    相比较其它的内存泄露检测工具,它在检测到内存泄漏的同时,还具有如下特点:  1、 可以得到内存泄漏点的调用堆栈,如果可以的话,还可以得到其所在文件及行号;  2、 可以得到泄露内存的完整数据;  3、 可以...

    JavaScript内存泄漏的处理方式

    下面就是小编整理的关于JS遇到内存泄漏问题时应该采取的处理方式。 随着现在的编程语言功能越来越成熟、复杂,内存管理也容易被大家忽略。本文将会讨论JavaScript中的内存泄漏以及如何处理,方便大家在使用...

    MFC中解决子线程中打开非模态对话框内存泄漏实例(VC++2008)

    子线程中打开非模式对话框内存泄漏问题 这个问题困扰已久 网上没有完整的解决方案;现将实例源代码分享给大家 希望对您有帮助 (代码是VS2008下编写的) 问题原因: 对话框的默认关闭方式模式对话框关闭 而现在是...

    JAVA内存泄漏问题处理方法经验总结

    NULL 博文链接:https://javaprimary.iteye.com/blog/2286161

Global site tag (gtag.js) - Google Analytics