STL的问题!memory leaks
我发现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;
}
}
}
不知道问题出在什么地方?