C++中的内存泄露问题
-
- 帖子: 448
- 注册时间: 2008-07-10 15:08
C++中的内存泄露问题
最近编程的过程中用到了好些的new和delete之类的分配内存并释放内存代码,有人给我指出这样要很注意内存的泄露,
我上网查了查:说一个小的内存泄露不需要太注意,但是大的内存泄露,或者渐增式的内存泄露,一定要引起注意,否则轻者会引起性能下降,再就是引起复杂的内存消耗错误,最坏的是。一个内存泄露程序可能用完了所有可用的内存,影响其他程序的运行。
针对这些我有几个问题;
1. 内存泄露是永久性的还是暂时性的,既是一个内存泄露它的影响,是影响一个程序的始终还是影响到物理内存,不管你啥时候这个内存泄露造成的“创伤”都是无法抹去的?
2.对于已经造成的内存泄露有没有补救的措施?
3.还有我的程序中动态分配的内存,在还没有来的及释放程序就意外终止了,这样是不是也要造成内存泄露啊?
4.linux下有个valgrind可以用来检测内存的利用以防止内存泄露的,它是用来防的不是用来治的吧?
我上网查了查:说一个小的内存泄露不需要太注意,但是大的内存泄露,或者渐增式的内存泄露,一定要引起注意,否则轻者会引起性能下降,再就是引起复杂的内存消耗错误,最坏的是。一个内存泄露程序可能用完了所有可用的内存,影响其他程序的运行。
针对这些我有几个问题;
1. 内存泄露是永久性的还是暂时性的,既是一个内存泄露它的影响,是影响一个程序的始终还是影响到物理内存,不管你啥时候这个内存泄露造成的“创伤”都是无法抹去的?
2.对于已经造成的内存泄露有没有补救的措施?
3.还有我的程序中动态分配的内存,在还没有来的及释放程序就意外终止了,这样是不是也要造成内存泄露啊?
4.linux下有个valgrind可以用来检测内存的利用以防止内存泄露的,它是用来防的不是用来治的吧?
- devin
- 帖子: 189
- 注册时间: 2008-08-26 22:57
- 来自: 长沙
Re: C++中的内存泄露问题
1、内存泄漏是表示运行中的进程使用了new,malloc在heap上分配了内存,但在内存使用完成后没有释放,而且没有指针再指向这块内存,这块内存在当前进程中永远无法再使用或释放。
2、内存泄漏只对一个运行中进程有效,如果进程运行结束,操作系统会把这个进程所有内存释放掉,当然也包括泄漏了的内存。
3、如果一个程序只运行很短的时间,有少量的内存泄漏没有关系,因为进程一结束,进程占用的所有的内存都释放掉了。如果是长期运行的程序,特别是服务器程序,绝不能有内存泄漏。
4、内存泄漏不一定只指内存没有释放,其实程序能申请的所有资源如socket、锁、文件句柄,数据库连接等如果没有合法释放,长期运行中都会有问题,而且泄漏这些资源很多都会表现为内存被大量占用。
2、内存泄漏只对一个运行中进程有效,如果进程运行结束,操作系统会把这个进程所有内存释放掉,当然也包括泄漏了的内存。
3、如果一个程序只运行很短的时间,有少量的内存泄漏没有关系,因为进程一结束,进程占用的所有的内存都释放掉了。如果是长期运行的程序,特别是服务器程序,绝不能有内存泄漏。
4、内存泄漏不一定只指内存没有释放,其实程序能申请的所有资源如socket、锁、文件句柄,数据库连接等如果没有合法释放,长期运行中都会有问题,而且泄漏这些资源很多都会表现为内存被大量占用。
i7 2630QM+ 4G ram + 500g hd + arch
11.04装新机器上死机,只好换arch了
11.04装新机器上死机,只好换arch了
- devin
- 帖子: 189
- 注册时间: 2008-08-26 22:57
- 来自: 长沙
Re: C++中的内存泄露问题
c和c++中有很多工具可以检测内存的泄漏,主要原理是跟踪每一次分配内存调用和释放调用,如果在程序结束时“不对称”,就认为内存泄漏了。
如果已经内存泄漏了很难补救,因为已经没有办法访问到已经泄漏的内存,没有办法把泄漏内存的地址交给free()或delete进行释放。但也不是绝对没有办法。
所以写c或c++程序时要养成好习惯,另外可以使用智能指针来管理内存。
如果已经内存泄漏了很难补救,因为已经没有办法访问到已经泄漏的内存,没有办法把泄漏内存的地址交给free()或delete进行释放。但也不是绝对没有办法。
所以写c或c++程序时要养成好习惯,另外可以使用智能指针来管理内存。
i7 2630QM+ 4G ram + 500g hd + arch
11.04装新机器上死机,只好换arch了
11.04装新机器上死机,只好换arch了
-
- 帖子: 448
- 注册时间: 2008-07-10 15:08
Re: C++中的内存泄露问题
devin, 哦谢谢,非常谢谢
我对内存泄露有了更深入的认识,我知道了,在程序的编写过程中难免有内存泄露,
我写的恰是运行在服务器上的程序,在程序尚未真正运行在服务器上的时候,多调试并用,内存泄露工具多检测
对于存在内存泄露的地方第一时间进行改正,争取在真正使用时最小限度地减少内存泄露(因为我不敢保证修改后的程序没有一点泄露),是这个思路吧?
,最后你说到智能指针我得好好看看了,见过这东西但是没有好好研究过。
我对内存泄露有了更深入的认识,我知道了,在程序的编写过程中难免有内存泄露,
我写的恰是运行在服务器上的程序,在程序尚未真正运行在服务器上的时候,多调试并用,内存泄露工具多检测
对于存在内存泄露的地方第一时间进行改正,争取在真正使用时最小限度地减少内存泄露(因为我不敢保证修改后的程序没有一点泄露),是这个思路吧?
,最后你说到智能指针我得好好看看了,见过这东西但是没有好好研究过。
-
- 帖子: 438
- 注册时间: 2008-03-30 10:35
Re: C++中的内存泄露问题
太自动的东西我都不放心,要是智能指针能够拯救cpp的话,那大家早就用了,这说明这个东西有问题。weihua2008 写了:devin, 哦谢谢,非常谢谢
我对内存泄露有了更深入的认识,我知道了,在程序的编写过程中难免有内存泄露,
我写的恰是运行在服务器上的程序,在程序尚未真正运行在服务器上的时候,多调试并用,内存泄露工具多检测
对于存在内存泄露的地方第一时间进行改正,争取在真正使用时最小限度地减少内存泄露(因为我不敢保证修改后的程序没有一点泄露),是这个思路吧?
,最后你说到智能指针我得好好看看了,见过这东西但是没有好好研究过。
- xhy
- 帖子: 3916
- 注册时间: 2005-12-28 1:16
- 系统: Ubuntu 12.10 X64
- 来自: 火星
-
- 帖子: 438
- 注册时间: 2008-03-30 10:35
Re: C++中的内存泄露问题
cpp已经一天不如一天了,致命的缺陷,拯救不了。xhy 写了:智能指针要拯救的不是cpp, 而是那些蹩脚的cpp程序员
-
- 帖子: 448
- 注册时间: 2008-07-10 15:08
Re: C++中的内存泄露问题
gong, xhy,
两位说的有点不乐观啊,既然你们说内存泄漏是c++的致命缺陷,
那这个内存泄漏是不是只存在一个进程中存在,当我结束这个进程的时候,是不是就内存泄漏(即没有释放的内存)就消失了?
两位说的有点不乐观啊,既然你们说内存泄漏是c++的致命缺陷,
那这个内存泄漏是不是只存在一个进程中存在,当我结束这个进程的时候,是不是就内存泄漏(即没有释放的内存)就消失了?
-
- 帖子: 438
- 注册时间: 2008-03-30 10:35
Re: C++中的内存泄露问题
一般成熟的操作系统会收回的,但是这样的程序不利于长期运行。weihua2008 写了:gong, xhy,
两位说的有点不乐观啊,既然你们说内存泄漏是c++的致命缺陷,
那这个内存泄漏是不是只存在一个进程中存在,当我结束这个进程的时候,是不是就内存泄漏(即没有释放的内存)就消失了?
-
- 帖子: 448
- 注册时间: 2008-07-10 15:08
Re: C++中的内存泄露问题
我知道的,还是那句话,我在程序测试的时候检测防止内存泄漏,但是在运行的时候难免程序意外中止,这个时候,是不是也算进程结束,此前的内存泄漏就会释放掉,你的意思是说一个存在内存泄漏的程序,不易于不间断的长期运行,是吧?
-
- 帖子: 438
- 注册时间: 2008-03-30 10:35
Re: C++中的内存泄露问题
是,操作系统负责管理这方面的内存收发。
是,比如作server。你看firefox的内存泄漏就很严重,但是不是拿来长期运行的,所以泄漏一下也不碍事,只是作为一个好程序应该杜绝这样的现象。
是,比如作server。你看firefox的内存泄漏就很严重,但是不是拿来长期运行的,所以泄漏一下也不碍事,只是作为一个好程序应该杜绝这样的现象。
- BigSnake.NET
- 帖子: 12522
- 注册时间: 2006-07-02 11:16
- 来自: 廣州
- 联系:
Re: C++中的内存泄露问题
用 boost 里面的那个gong 写了:太自动的东西我都不放心,要是智能指针能够拯救cpp的话,那大家早就用了,这说明这个东西有问题。weihua2008 写了:devin, 哦谢谢,非常谢谢
我对内存泄露有了更深入的认识,我知道了,在程序的编写过程中难免有内存泄露,
我写的恰是运行在服务器上的程序,在程序尚未真正运行在服务器上的时候,多调试并用,内存泄露工具多检测
对于存在内存泄露的地方第一时间进行改正,争取在真正使用时最小限度地减少内存泄露(因为我不敢保证修改后的程序没有一点泄露),是这个思路吧?
,最后你说到智能指针我得好好看看了,见过这东西但是没有好好研究过。
引用某人的话
auto_ptr 是 brainfucker 。。
^_^ ~~~
要理解递归,首先要理解递归。
地球人都知道,理论上,理论跟实际是没有差别的,但实际上,理论跟实际的差别是相当大滴。
要理解递归,首先要理解递归。
地球人都知道,理论上,理论跟实际是没有差别的,但实际上,理论跟实际的差别是相当大滴。
- xhy
- 帖子: 3916
- 注册时间: 2005-12-28 1:16
- 系统: Ubuntu 12.10 X64
- 来自: 火星
Re: C++中的内存泄露问题
是用户群体素质下降了gong 写了:cpp已经一天不如一天了,致命的缺陷,拯救不了。xhy 写了:智能指针要拯救的不是cpp, 而是那些蹩脚的cpp程序员
cpp最大的缺点是过于复杂和强大,不适合这个浮躁与功利的社会
目前负债150多万
- BigSnake.NET
- 帖子: 12522
- 注册时间: 2006-07-02 11:16
- 来自: 廣州
- 联系:
Re: C++中的内存泄露问题
什么时候我的C++功力达到那些写boost的人那样就好了。。
^_^ ~~~
要理解递归,首先要理解递归。
地球人都知道,理论上,理论跟实际是没有差别的,但实际上,理论跟实际的差别是相当大滴。
要理解递归,首先要理解递归。
地球人都知道,理论上,理论跟实际是没有差别的,但实际上,理论跟实际的差别是相当大滴。