青浦信息港
故事
当前位置:首页 > 故事

Bjarne如何对付内存泄漏

发布时间:2019-06-20 02:26:40 编辑:笔名

  写出那些不会导致任何内存泄漏的代码。很明显,当你的代码中到处充满了new 操作、delete操作和指针运算的话,你将会在某个地方搞晕了头,导致内存泄漏,指针引用错误,以及诸如此类的问题。

  这和你如何小心地对待内存分配工作其实完全没有关系:代码的复杂性终总是会超过你能够付出的时间和努力。于是随后产生了一些成功的技巧,它们依赖于将内存分配(allocations)与重新分配(deallocation)工作隐藏在易于管理的类型之后。标准容器(standard containers)是一个的例子。它们不是通过你而是自己为元素管理内存,从而避免了产生糟糕的结果。想象一下,没有string和vector的帮助,写出这个:

  #includevector

  #includestring

  #includeiostream

  #includealgorithm

  using namespace std;

  int main() // small program messing around with strings

  {

  cout "enter some whitespace-separated words:\n";

  vectorstring v;

  string s;

  while (cins) sh_back(s);

  sort(gin(),d());

  string cat;

  typedef vectorstring::const_iterator Iter;

  for (Iter p = gin(); p!=d(); ++p) cat += *p+"+";

  cout cat ’\n’;

  }

  你有多少机会在次就得到正确的结果?你又怎么知道你没有导致内存泄漏呢?

  注意,没有出现显式的内存管理,宏,造型,溢出检查,显式的长度限制,以及指针。通过使用函数对象和标准算法(standard algorithm),我可以避免使用指针——例如使用迭代子(iterator),不过对于一个这么小的程序来说有点小题大作了。

  这些技巧并不完美,要系统化地使用它们也并不总是那么容易。但是,应用它们产生了惊人的差异,而且通过减少显式的内存分配与重新分配的次数,你甚至可以使余下的例子更加容易被跟踪。早在1981年,我就指出,通过将我必须显式地跟踪的对象的数量从几万个减少到几打,为了使程序正确运行而付出的努力从可怕的苦工,变成了应付一些可管理的对象,甚至更加简单了。

  如果你的程序还没有包含将显式内存管理减少到小限度的库,那么要让你程序完成和正确运行的话,快的途径也许就是先建立一个这样的库。

  模板和标准库实现了容器、资源句柄以及诸如此类的东西,更早的使用甚至在多年以前。异常的使用使之更加完善。

  如果你实在不能将内存分配/重新分配的操作隐藏到你需要的对象中时,你可以使用资源句柄(resource handle),以将内存泄漏的可能性降至。这里有个例子:我需要通过一个函数,在空闲内存中建立一个对象并返回它。这时候可能忘记释放这个对象。毕竟,我们不能说,仅仅关注当这个指针要被释放的时候,谁将负责去做。使用资源句柄,这里用了标准库中的auto_ptr,使需要为之负责的地方变得明确了。

  #includememory

  #includeiostream

  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; // 谁该负责释放这个S?

  };

  auto_ptrS g()

  {

  return auto_ptrS(new S); // 显式传递负责释放这个S

  }

  int main()

  {

  cout "start main\n";

  S* p = f();

  cout "after f() before g()\n";

  // S* q = g(); // 将被编译器捕捉

  auto_ptrS q = g();

  cout "exit main\n";

  // *p产生了内存泄漏

  // *q被自动释放

  }

  在更一般的意义上考虑资源,而不仅仅是内存。

  如果在你的环境中不能系统地应用这些技巧(例如,你必须使用别的地方的代码,或者你的程序的另一部分简直是原始人类(译注:原文是Neanderthals,尼安德特人,旧石器时代广泛分布在欧洲的猿人)写的,如此等等),那么注意使用一个内存泄漏检测器作为开发过程的一部分,或者插入一个垃圾收集器(garbage collector)。 查看本文来源

汉森四磨汤小孩吃多少
新生儿黄疸会出现哪些症状
小儿便秘饮食注意什么
友情链接
营养不良 骨肿瘤 湛江有哪些神经内科医院 湛江有哪些小儿神经内科医院 惠州有哪些小儿妇科医院 惠州有哪些手外科医院 汕尾有哪些外伤科医院 东莞有哪些中医内科医院 中山有哪些眼科医院 潮州有哪些骨科医院 潮州有哪些小儿肾内科医院 揭阳有哪些整形科医院 揭阳有哪些肝病科医院 揭阳有哪些超声科医院 济南有哪些心外科医院 淄博有哪些小儿胸外科医院 东营有哪些老年病科医院 烟台有哪些口腔修复科医院 济宁有哪些心血管外科医院 济宁有哪些胃肠外科医院 泰安有哪些产前诊断科医院 荆门有哪些全科医院 新乡有哪些免疫科医院 新乡有哪些其他内科医院 新乡有哪些全科医院 焦作有哪些医学影像学医院 濮阳有哪些中医肝病科医院 许昌有哪些五官科医院 许昌有哪些小儿外科医院 漯河有哪些功能神经外科医院 漯河有哪些放射科医院 漯河有哪些急诊科医院 南阳有哪些其它科室医院 邓州有哪些整形科医院 邓州有哪些免疫科医院 邓州有哪些小儿内分泌科医院 邓州有哪些小儿内科医院 邓州有哪些心血管外科医院 邓州有哪些中医推拿按摩科医院 商丘有哪些急诊科医院 商丘有哪些司法鉴定科医院 信阳有哪些其他外科医院 信阳有哪些血管外科医院 信阳有哪些中医男科医院 驻马店有哪些其它科室医院 驻马店有哪些传染病科医院 自贡有哪些内科医院 自贡有哪些中医肾病内科医院 达州有哪些疼痛科医院 达州有哪些心理咨询科医院 资阳有哪些小儿泌尿科医院 阿坝有哪些医学影像学医院 石家庄有哪些肿瘤科医院 秦皇岛有哪些男科医院 秦皇岛有哪些成瘾医学科医院 秦皇岛有哪些肿瘤综合科医院 邯郸有哪些男科医院 承德有哪些小儿胸外科医院 双鸭山有哪些乳腺外科医院 怒江医学影像学医院哪家好 铁岭有哪些IMCC医院 铜仁肛肠科医院哪家好 宣城有哪些泌尿外科医院 临高疼痛科医院哪家好