一不小心,漏了!

来源:互联网 发布:怎样取消数据有效性 编辑:程序博客网 时间:2024/04/28 23:24

 这几天在写用遗传算法解决装箱问题的程序,碰到了好多奇怪的事情。其实奇怪的原因在于使用c++的指针不熟造成的,当然,指针不熟最常见的问题就是内存泄露了。想到一个很有意思的问题,即使不是我的程序的内存泄露,而我确实需要大量的内存该咋办?可以看一下这个帖子:

http://topic.csdn.net/u/20091027/16/8b8e3761-1569-4ffc-8528-bd560ada9265.html

好像也没有什么好办法。

发上面的帖子的时候,但是不是内存泄露,是我做内存测试而故意弄出来的。但是今天却发现了一个真正的泄露,程序一旦运行,就发现占用内存在一直的上升,然后到了2g的时候,就出现内存申请异常了,造成的原因,却有一定的启发性。

由于做的程序的计算量比较大,因此做程序的时候手头放了一本《提高C++性能的编程技术》边看边参考,受益匪浅。其中有一条提到 缓式计算 ,大体意思是不要预先定义好对象,直到用得着的时候再定义,会提高性能,类似于下面的:


X x;

if (condition)

  x.DoSomthing;

这段代码,由于condition的存在,会导致x的构造有时候会成为一种浪费的开销,特别是当x的构造函数花费比较大的时候,因此写成下面的,效果会更好点:


if (condition){

  X x;

  x.DoSomthing;

}

问题就出在这里了。看我的代码


定义了两个局部的CGenome father 和 mother,结果导致了内存的大量泄漏,原因在于由于使用了赋值运算符的重载,每次对father进行赋值的时候,都会申请一块内存,从而造成泄漏。

解决方法比较简单,只需在赋值运算重载中加一个判断,判断当前的boxs是否为NULL就可以了。

原创粉丝点击