STL的问题!memory leaks

tlovexyj 2002-01-15 08:22:14
我发现VC自带的STL在声明map简单如map <int, int> a;时都会出现一大堆不知所谓的warnings。但使用正常。并没有memory leaks
后来换SGI的STL,没有warnings了,但是BoundsChecker会报Memory Leaks,显示位置为stl_alloc.h中的函数
__default_alloc_template<__threads, __inst>::_S_chunk_alloc(size_t __size, int& __nobjs) 中的这一句:
_S_start_free = (char*)malloc(__bytes_to_get);

在写一个DirectDraw的程序,其中用到了STL的map。具体定义如下:
typedef struct _ACTION
{
vector<LPDIRECTDRAWSURFACE>Pics;
int nFrames;
int nDelay;
bool bBackLoop;
}ACTION;

std::map <std::string, ACTION> m_arrayPics;

构造时是这样的:
/**************************************************************
char * pActionName --- 动作名,索引一个ACTION结构
int nFrames --- 帧数,确定ACTION结构中pPics的大小
char * pFileNames --- 帧对应的BMP
unsigned int nDelay --- 帧间的延时
bool bBackLoop --- 显示时是否回转,如果帧数为3: 0->2然后自动2->0
***************************************************************/
bool CSprite::
//载入一个ACTION,设置坐标0,0的颜色为透明色
LoadPics(char * pActionName, int nFrames, char * pFileNames[], unsigned int nDelay, bool bBackLoop, bool bMuseOver)
{
ASSERT(nFrames>0);

ACTION p;
p.Pics.resize(nFrames);
for (int n=0; n<nFrames; n++)
{
LPDIRECTDRAWSURFACE pp = p.Pics[n] = GetDDWin()->CreateSurface(pFileNames[n]);
if ( NULL == pp )
{
for (int m=0; m<n; m++)
if (p.Pics[m])
p.Pics[m]->Release(), p.Pics[m]=NULL;
return false;
}
else
{
DDSURFACEDESC ddsd;
LPWORD lpSurface;
HRESULT ddrval;
COLORREF color;

ddsd.dwSize = sizeof(ddsd);

//锁定Surface,DDraw中的Surface必须先锁定,然后才能访问
while((ddrval=(pp)->Lock(NULL, &ddsd, 0, NULL))==DDERR_WASSTILLDRAWING);
if(ddrval == DD_OK)
{
// 起始地址指针,注意其类型是指向WORD的指针
lpSurface = (LPWORD)ddsd.lpSurface;
color = *lpSurface;
// 对Back Surface解锁,Surface访问后必须要解锁
(pp)->Unlock(NULL);
}

DDCOLORKEY ddck;
ddck.dwColorSpaceLowValue = color;
ddck.dwColorSpaceHighValue = color;
(pp)->SetColorKey(DDCKEY_SRCBLT, &ddck);
}
}
p.nFrames = nFrames;
p.bBackLoop = bBackLoop;
p.bMustOver = bMuseOver;

m_arrayPics[std::string(pActionName)] = p;

GetDDWin()->SetTimer( m_dwID, nDelay, NULL );

return true;
}
在最后的解构函数中,如下:
/**************************************************************
void
**************************************************************/
void CSprite::
//清除每一帧的LPDIRECTDRAWSURFACE,包括ACTION本身
Release()
{
std::map <std::string, ACTION>::iterator it = m_arrayPics.begin();
for (; it!=m_arrayPics.end(); it++)
{
ACTION * p = &((*it).second);
for (int n=0; n<p->nFrames; n++)
{
if ( p->Pics[n] )
p->Pics[n]->Release(), p->Pics[n]=NULL;
}

}
}

不知道问题出在什么地方?
...全文
301 31 打赏 收藏 转发到动态 举报
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
tlovexyj 2002-02-06
  • 打赏
  • 举报
回复
tlovexyj@21cn.com
www_com_me 2002-02-06
  • 打赏
  • 举报
回复
2 tlovexyj
老兄的email?
tlovexyj 2002-01-31
  • 打赏
  • 举报
回复
2 www_com_me:
请帖出你人代码,大家一起看看 ;)
是在map中用到了指针吗?
www_com_me 2002-01-28
  • 打赏
  • 举报
回复
最近也用到了map,用BoundsChecker检查竟说是_getbuf.c(系统的)中有memory leaks,
没办法,检查再检查,没发现,呵呵,忽略!
tlovexyj 2002-01-26
  • 打赏
  • 举报
回复
up~
tlovexyj 2002-01-21
  • 打赏
  • 举报
回复
up~
qqchen79 2002-01-20
  • 打赏
  • 举报
回复
这确实算得上STL的一个问题,把真的/假的memory leak都混在一起了,必须逐个仔细看看才行,真是麻烦。(我用的是Purify,一样的!)
tlovexyj 2002-01-19
  • 打赏
  • 举报
回复
up~
tlovexyj 2002-01-18
  • 打赏
  • 举报
回复
是啊是啊,为什么VC也报呢?
tlovexyj 2002-01-18
  • 打赏
  • 举报
回复
我在代码中已对pointer做了应当的delete。
只是对sgi的stl为什么会memory leaks不解。
望示之!
tlovexyj 2002-01-18
  • 打赏
  • 举报
回复
谢谢www_com_me:
这篇我刚看过,我这还有篇中文的译文,url:
http://www.fractal3d.com/articles/show.asp?aid=40
babysloth 2002-01-18
  • 打赏
  • 举报
回复
2 tlovexyj
我前面不是回答您了么?看SGI-STL的FAQ部分。
ttzzgg_80713 2002-01-18
  • 打赏
  • 举报
回复
为什么在VC中也报呢。没有用boundchecker
tlovexyj 2002-01-17
  • 打赏
  • 举报
回复
虽然我只是在init里写,并没有在loop里做这件事。
不过谢谢hap,我又清楚了一些东西。

看来候老师的GP&STL非买不可了!
hap 2002-01-17
  • 打赏
  • 举报
回复
用Insert方法既能判断是否插入成功,在效率上也比 map[...] = ...高,因为后者多了
一次赋值操作。而且如果你先用m_arrayPics.count(pActionName)的返回值是否>0来判断,再
决定用map[...] = ...插入,则有多了一次查找过程。
www_com_me 2002-01-17
  • 打赏
  • 举报
回复
关于vector中放指针引起memmory leak问题及其解决方法在这有一片值得读
http://www.cuj.com/experts/1910/austern.htm?topic=experts&topic=experts
tlovexyj 2002-01-17
  • 打赏
  • 举报
回复
请问在SGI_STL的文档中哪篇介绍了此事?请给出url,谢谢
babysloth 2002-01-16
  • 打赏
  • 举报
回复
文档的FAQ部分,Why does Bounds Checker say that I have memory leaks
不过如果在STL容器里放指针,那就小心,可能会出问题。用shared_ptr当然绝对安全。
boost是连不上,不过可以变通变通,试试64.226.201.52
tlovexyj 2002-01-16
  • 打赏
  • 举报
回复
上不了http://www.boost.org啊。!?!?!

如果SGI_STL没有memory leaks,那我是否完全可以放心使用它呢?(主要是怕我自己出了问题!:)
tlovexyj 2002-01-16
  • 打赏
  • 举报
回复
其实我在容器中容纳指针的目的是为了方便管理。
所以在知道容器会copy construct时,觉无所谓,反正最后我都会delete,应该不会出问题

可是VC却报memory leaks,而且量达1280bytes 和 1440bytes。太惊人了!
所以想问问容器对指针的支持程度。

现在改用VC的STL,关掉4786警告,什么事也没有。我想我的代码是应该没有问题的了;)

谢谢myan!

2 babysloth:
请问在SGI_STL的文档中哪篇介绍了此事?请给出url,谢谢
加载更多回复(11)

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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