C++中的内存泄露问题

软件和网站开发以及相关技术探讨
回复
weihua2008
帖子: 448
注册时间: 2008-07-10 15:08

C++中的内存泄露问题

#1

帖子 weihua2008 » 2008-12-05 16:31

最近编程的过程中用到了好些的new和delete之类的分配内存并释放内存代码,有人给我指出这样要很注意内存的泄露,
我上网查了查:说一个小的内存泄露不需要太注意,但是大的内存泄露,或者渐增式的内存泄露,一定要引起注意,否则轻者会引起性能下降,再就是引起复杂的内存消耗错误,最坏的是。一个内存泄露程序可能用完了所有可用的内存,影响其他程序的运行。
针对这些我有几个问题;
1. 内存泄露是永久性的还是暂时性的,既是一个内存泄露它的影响,是影响一个程序的始终还是影响到物理内存,不管你啥时候这个内存泄露造成的“创伤”都是无法抹去的?
2.对于已经造成的内存泄露有没有补救的措施?
3.还有我的程序中动态分配的内存,在还没有来的及释放程序就意外终止了,这样是不是也要造成内存泄露啊?
4.linux下有个valgrind可以用来检测内存的利用以防止内存泄露的,它是用来防的不是用来治的吧?
头像
devin
帖子: 189
注册时间: 2008-08-26 22:57
来自: 长沙

Re: C++中的内存泄露问题

#2

帖子 devin » 2008-12-05 16:56

1、内存泄漏是表示运行中的进程使用了new,malloc在heap上分配了内存,但在内存使用完成后没有释放,而且没有指针再指向这块内存,这块内存在当前进程中永远无法再使用或释放。

2、内存泄漏只对一个运行中进程有效,如果进程运行结束,操作系统会把这个进程所有内存释放掉,当然也包括泄漏了的内存。

3、如果一个程序只运行很短的时间,有少量的内存泄漏没有关系,因为进程一结束,进程占用的所有的内存都释放掉了。如果是长期运行的程序,特别是服务器程序,绝不能有内存泄漏。

4、内存泄漏不一定只指内存没有释放,其实程序能申请的所有资源如socket、锁、文件句柄,数据库连接等如果没有合法释放,长期运行中都会有问题,而且泄漏这些资源很多都会表现为内存被大量占用。
i7 2630QM+ 4G ram + 500g hd + arch
11.04装新机器上死机,只好换arch了
头像
devin
帖子: 189
注册时间: 2008-08-26 22:57
来自: 长沙

Re: C++中的内存泄露问题

#3

帖子 devin » 2008-12-05 17:09

c和c++中有很多工具可以检测内存的泄漏,主要原理是跟踪每一次分配内存调用和释放调用,如果在程序结束时“不对称”,就认为内存泄漏了。

如果已经内存泄漏了很难补救,因为已经没有办法访问到已经泄漏的内存,没有办法把泄漏内存的地址交给free()或delete进行释放。但也不是绝对没有办法。

所以写c或c++程序时要养成好习惯,另外可以使用智能指针来管理内存。
i7 2630QM+ 4G ram + 500g hd + arch
11.04装新机器上死机,只好换arch了
weihua2008
帖子: 448
注册时间: 2008-07-10 15:08

Re: C++中的内存泄露问题

#4

帖子 weihua2008 » 2008-12-05 20:44

devin, 哦谢谢,非常谢谢
我对内存泄露有了更深入的认识,我知道了,在程序的编写过程中难免有内存泄露,
我写的恰是运行在服务器上的程序,在程序尚未真正运行在服务器上的时候,多调试并用,内存泄露工具多检测
对于存在内存泄露的地方第一时间进行改正,争取在真正使用时最小限度地减少内存泄露(因为我不敢保证修改后的程序没有一点泄露),是这个思路吧?
,最后你说到智能指针我得好好看看了,见过这东西但是没有好好研究过。
gong
帖子: 438
注册时间: 2008-03-30 10:35

Re: C++中的内存泄露问题

#5

帖子 gong » 2008-12-05 22:13

weihua2008 写了:devin, 哦谢谢,非常谢谢
我对内存泄露有了更深入的认识,我知道了,在程序的编写过程中难免有内存泄露,
我写的恰是运行在服务器上的程序,在程序尚未真正运行在服务器上的时候,多调试并用,内存泄露工具多检测
对于存在内存泄露的地方第一时间进行改正,争取在真正使用时最小限度地减少内存泄露(因为我不敢保证修改后的程序没有一点泄露),是这个思路吧?
,最后你说到智能指针我得好好看看了,见过这东西但是没有好好研究过。
太自动的东西我都不放心,要是智能指针能够拯救cpp的话,那大家早就用了,这说明这个东西有问题。
头像
xhy
帖子: 3916
注册时间: 2005-12-28 1:16
系统: Ubuntu 12.10 X64
来自: 火星

Re: C++中的内存泄露问题

#6

帖子 xhy » 2008-12-05 22:27

智能指针要拯救的不是cpp, 而是那些蹩脚的cpp程序员
目前负债150多万
gong
帖子: 438
注册时间: 2008-03-30 10:35

Re: C++中的内存泄露问题

#7

帖子 gong » 2008-12-06 1:14

xhy 写了:智能指针要拯救的不是cpp, 而是那些蹩脚的cpp程序员
cpp已经一天不如一天了,致命的缺陷,拯救不了。
weihua2008
帖子: 448
注册时间: 2008-07-10 15:08

Re: C++中的内存泄露问题

#8

帖子 weihua2008 » 2008-12-06 9:50

gong, xhy,
两位说的有点不乐观啊,既然你们说内存泄漏是c++的致命缺陷,
那这个内存泄漏是不是只存在一个进程中存在,当我结束这个进程的时候,是不是就内存泄漏(即没有释放的内存)就消失了?
gong
帖子: 438
注册时间: 2008-03-30 10:35

Re: C++中的内存泄露问题

#9

帖子 gong » 2008-12-06 10:50

weihua2008 写了:gong, xhy,
两位说的有点不乐观啊,既然你们说内存泄漏是c++的致命缺陷,
那这个内存泄漏是不是只存在一个进程中存在,当我结束这个进程的时候,是不是就内存泄漏(即没有释放的内存)就消失了?
一般成熟的操作系统会收回的,但是这样的程序不利于长期运行。
weihua2008
帖子: 448
注册时间: 2008-07-10 15:08

Re: C++中的内存泄露问题

#10

帖子 weihua2008 » 2008-12-06 11:36

我知道的,还是那句话,我在程序测试的时候检测防止内存泄漏,但是在运行的时候难免程序意外中止,这个时候,是不是也算进程结束,此前的内存泄漏就会释放掉,你的意思是说一个存在内存泄漏的程序,不易于不间断的长期运行,是吧?
gong
帖子: 438
注册时间: 2008-03-30 10:35

Re: C++中的内存泄露问题

#11

帖子 gong » 2008-12-06 11:44

是,操作系统负责管理这方面的内存收发。
是,比如作server。你看firefox的内存泄漏就很严重,但是不是拿来长期运行的,所以泄漏一下也不碍事,只是作为一个好程序应该杜绝这样的现象。
头像
BigSnake.NET
帖子: 12522
注册时间: 2006-07-02 11:16
来自: 廣州
联系:

Re: C++中的内存泄露问题

#12

帖子 BigSnake.NET » 2008-12-06 14:03

gong 写了:
weihua2008 写了:devin, 哦谢谢,非常谢谢
我对内存泄露有了更深入的认识,我知道了,在程序的编写过程中难免有内存泄露,
我写的恰是运行在服务器上的程序,在程序尚未真正运行在服务器上的时候,多调试并用,内存泄露工具多检测
对于存在内存泄露的地方第一时间进行改正,争取在真正使用时最小限度地减少内存泄露(因为我不敢保证修改后的程序没有一点泄露),是这个思路吧?
,最后你说到智能指针我得好好看看了,见过这东西但是没有好好研究过。
太自动的东西我都不放心,要是智能指针能够拯救cpp的话,那大家早就用了,这说明这个东西有问题。
用 boost 里面的那个

引用某人的话

auto_ptr 是 brainfucker 。。
^_^ ~~~
要理解递归,首先要理解递归。

地球人都知道,理论上,理论跟实际是没有差别的,但实际上,理论跟实际的差别是相当大滴。
头像
xhy
帖子: 3916
注册时间: 2005-12-28 1:16
系统: Ubuntu 12.10 X64
来自: 火星

Re: C++中的内存泄露问题

#13

帖子 xhy » 2008-12-06 14:43

gong 写了:
xhy 写了:智能指针要拯救的不是cpp, 而是那些蹩脚的cpp程序员
cpp已经一天不如一天了,致命的缺陷,拯救不了。
是用户群体素质下降了

cpp最大的缺点是过于复杂和强大,不适合这个浮躁与功利的社会
目前负债150多万
头像
BigSnake.NET
帖子: 12522
注册时间: 2006-07-02 11:16
来自: 廣州
联系:

Re: C++中的内存泄露问题

#14

帖子 BigSnake.NET » 2008-12-06 17:59

什么时候我的C++功力达到那些写boost的人那样就好了。。
^_^ ~~~
要理解递归,首先要理解递归。

地球人都知道,理论上,理论跟实际是没有差别的,但实际上,理论跟实际的差别是相当大滴。
回复