关于内存管理与泄漏

hungta 2003-10-20 10:55:18
请这方面有经验的人谈一下这个话题,或给出链接。

在一个在线检测项目(机器视觉在线检测)中,我是用S/C结构。十几个CLIENT采集图象并计算结果,将结果(缺陷的图象和特征数据)发送到SERVOR,每一个CLIENT连接一个摄像机。

在这个项目中我深受内存泄漏之苦,系统在线运行2小时SERVOER内存减少1/4。我把所有malloc()、new、各种资源句柄都进行了free()、delete、Release,可是还是没有用。

请教有经验的人,还应该注意什么。
...全文
82 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
hungta 2003-10-24
  • 打赏
  • 举报
回复
_CrtMemState s1, s2, s3;
_CrtMemCheckpoint( &s1 );

float fX, fY;

fX=12.034;
fY=0.23;
CString csSort;
csSort.Format("%.0f/%.0f (mm)", fX, fY);

_CrtMemCheckpoint( &s2 );
if ( _CrtMemDifference( &s3, &s1, &s2 ) )
_CrtMemDumpStatistics( &s3 );


调试运行结果是:

0 bytes in 0 Free Blocks.
36 bytes in 1 Normal Blocks.
0 bytes in 0 CRT Blocks.
0 bytes in 0 Ignore Blocks.
0 bytes in 0 Client Blocks.
Largest number used: 36 bytes.
Total allocations: 36 bytes.

与下面的调试结果是一样的:

_CrtMemState s1, s2, s3;
_CrtMemCheckpoint( &s1 );

float *fX;
fX= new float[10];

_CrtMemCheckpoint( &s2 );
if ( _CrtMemDifference( &s3, &s1, &s2 ) )
_CrtMemDumpStatistics( &s3 );

这不是说
csSort.Format("%.0f/%.0f (mm)", fX, fY);
存在内存泄漏吗?
北极猩猩 2003-10-24
  • 打赏
  • 举报
回复
这样无目的的乱找是不行的,必须要使用一些工具来查找。
hungta 2003-10-24
  • 打赏
  • 举报
回复
不好意思,好像上面没有泄漏的问题,但即使没有内存泄漏,好象这样也不妥吧。--把栈指针返回

下面这句怎么会有内存泄漏呢?!
float fX, fY;

fX=12.034;
fY=0.23;
CString csSort;
csSort.Format("%.0f/%.0f (mm)", fX, fY);
hungta 2003-10-24
  • 打赏
  • 举报
回复
谢谢各位参与讨论,我好像找到罪魁祸首啦!贴出来与大家共享
前面已经说过,我用各种手段都找不对丝毫信息,包括用boundschecker.
后来就一段一段的用
_CrtMemState s1, s2, s3;
_CrtMemCheckpoint( &s1 );
。。。
待检查的代码段
。。。

_CrtMemCheckpoint( &s2 );
if ( _CrtMemDifference( &s3, &s1, &s2 ) )
_CrtMemDumpStatistics( &s3 );

然后调试运行,结果在output中提示如下:

0 bytes in 0 Free Blocks.
1624 bytes in 3 Normal Blocks.
0 bytes in 0 CRT Blocks.
0 bytes in 0 IgnoreClient Blocks.
0 bytes in 0 (null) Blocks.
Largest number used: 1245 bytes.
Total allocations: 1624 bytes.

此提示说明你在三个地方有内存泄漏字节数为1624 bytes

而这段代码却是如下一个函数:
char * CAVIServorDlg::FlawSort(int iSort)
{
char * pSort;
switch(iSort)
{
case 10:
pSort = "SC1";
break;
case 11:
pSort = "SC2";
break;
case 12:
pSort = "SC3";
break;
case 20:
pSort = "FI";
break;
case 30:
pSort = "DT";
break;
case 40:
pSort = "OX";
break;
case 50:
pSort = "UN";
break;
case 60:
pSort = "DI";
break;
case 70:
pSort = "CO";
break;
case 80:
pSort = "CT";
break;
case 90:
pSort = "UN";
break;

default:
pSort = "UN";
}
return pSort;
}

其实很低级的错误,可是我一直把注意力放在new, malloc,GDI上所以很难发现。
每次调用该函数,都会有1624字节的泄漏,我在程序里成千上万次调用,当然内存损失严重,当然可能还有类似的错误。

同时我也发现上面查找内存泄漏的方法很厉害啊,这种泄漏一般工具可能不会发现的。
大家可以讨论一下,再挖掘一下


cjg325 2003-10-24
  • 打赏
  • 举报
回复
boundschecker 对我用向导生成的代码就监测有资源泄漏,它是误报吗?
Jinhao 2003-10-21
  • 打赏
  • 举报
回复
to david08(David):you are right,我居然犯了这样的错误~~真够rubbish
class object
{ type1 *a;
type2 *b;
public:
object()
{
a=new type1[10];
b=new type2[10];
}
~object(){ delete []a;delete []b; }
};
oyd 2003-10-21
  • 打赏
  • 举报
回复
用自动指针啦,我参与的上一个项目就是,所有的对象的释放全用了自动指针。
函数参数里随便new,完全不用担心内存泄漏。
Darkay_Lee 2003-10-21
  • 打赏
  • 举报
回复
估计你的内存泄漏不是很明显,否则应该走读代码就可以看出来。可以借助一些工具(如Purify,Numega等)会有些帮助。有很多时候代码确实是释放了,可是可能有一异常的缘故,根本到不了释放那里。我现在是越来越倾向于使用智能指针或者“监视器”之类的东西扶植释放内存。
Jinhao 2003-10-21
  • 打赏
  • 举报
回复

class objec 少写了个t,class object
Jinhao 2003-10-21
  • 打赏
  • 举报
回复
to mmlymlymly(mly)
调用下面这个对象的构造函数
class objec
{
public:
object()
{
type1 *a=new type1[10];
type2 *b=new type2[10];
}
~object(){ delete []a;delete []b; }
};

type1 *a=new type1[10];
type2 *b=new type2[10]; //万一在这里发生异常,没捕捉,那么就不会调用这个类的析够函数且不保证释放前面那个new出来的东东,这样就会内存泄露
david08 2003-10-21
  • 打赏
  • 举报
回复
class objec
{
public:
object()
{
type1 *a=new type1[10];
type2 *b=new type2[10];
}
~object(){ delete []a;delete []b; }
};//这个就会造成内存泄露

I do not think that this piece of code will result to memory leak, because it cannot be compiled at all!
54321go 2003-10-21
  • 打赏
  • 举报
回复
1.确认一下设计的类是否存在有内存分配的情况,如果有,那你就要确认是否在赋值操作中,是否释放了原有的内存。
2.在一些GDI对象删除的时候也要注意不是调用了删除操作就可以释放的,对选进设备上下文的GDI对象进行删除是没有用,必须要选出来。

你有没有用socket ,对于你绑定的消息,要处理,消息队列的累积也会耗尽资源的。
darcymei 2003-10-21
  • 打赏
  • 举报
回复
to Jinhao(辣子鸡丁)
什么意思?
a,b如果是object的私有成员这样也会内存泄漏?
Jinhao 2003-10-21
  • 打赏
  • 举报
回复
补上
调用上面函数fun
fun(new tyoe1,new type2);可能导致内存泄露
Jinhao 2003-10-21
  • 打赏
  • 举报
回复
其实资源泄露就是内存泄露,分开说只是他们的表现方式不同
class objec
{
public:
object()
{
type1 *a=new type1[10];
type2 *b=new type2[10];
}
~object(){ delete []a;delete []b; }
};//这个就会造成内存泄露

void fun(type1* a, type2* b)
{
delete a; //或delete []a
delete b; //或delete[]b
}这样的代码也有可能造成内存泄露
....还有很多
hungta 2003-10-20
  • 打赏
  • 举报
回复
还有哪些资源泄漏,请举例一下。位图我没有用
HostOOP 2003-10-20
  • 打赏
  • 举报
回复
老大可以用用insure++这样的工具软件测一测呀。

http://www1.baidu.com/baidu?cl=3&tn=baidu&word=insure+c%2B%2B
Jinhao 2003-10-20
  • 打赏
  • 举报
回复
有其他资源的泄露撒,内存泄露只是其中一种
gnixemos 2003-10-20
  • 打赏
  • 举报
回复
用类的析构来free比较好
liao2001 2003-10-20
  • 打赏
  • 举报
回复
确认是内存泄漏?

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧