结构体:
typedef struct tagTIMESLOTINFO
{
char *chTimeSlotName;
unsigned short usTimeSlotData;
}TIMESLOTINFO,*PTIMESLOTINFO;
构造函数里面执行:
for (int i = 0; i < 63; i ++)
{
        PTIMESLOTINFO timeSlotInfo = new TIMESLOTINFO;
if ( timeSlotInfo )
{
strValue.Format("VC12_%02d",i+1);
timeSlotInfo->chTimeSlotName = new char[strValue.GetLength()+1];
strcpy(timeSlotInfo->chTimeSlotName,strValue);
timeSlotInfo->usTimeSlotData = i+1;
m_timeSlotInfoArray.Add(timeSlotInfo);
}
}
析构函数里执行:
int nCount = m_timeSlotInfoArray.GetSize();
while ( --nCount >= 0 )
{
PTIMESLOTINFO pTimeSlotInfo = m_timeSlotInfoArray.GetAt(0);
m_timeSlotInfoArray.RemoveAt(0);
if ( pTimeSlotInfo )
{
if ( pTimeSlotInfo->chTimeSlotName )
{
delete [] pTimeSlotInfo->chTimeSlotName;
pTimeSlotInfo->chTimeSlotName = NULL;
}
delete pTimeSlotInfo;
pTimeSlotInfo = NULL;
}
}
用_CrtDumpMemoryLeaks();显示红色部分有内存泄露内存泄露VC

解决方案 »

  1.   

    for (int i = 0; i < 63; i ++)
    在这里面释放。。
      

  2.   

    循环体内每回都开辟一块内存,你用的变量都是函数内变量,怎么可能在析构函数中释放?
    类单元变量开辟的内存才是在析构函数中释放的,即使是这类变量,释放内存也仅仅是释放最后一次开辟的。
    所以就像一楼说的,在循环体内释放,用完就释放。
    一个NEW对应一个DELETE,记住这个规律就不会有问题了。
      

  3.   


    PTIMESLOTINFO timeSlotInfo = new TIMESLOTINFO;
    timeSlotInfo->chTimeSlotName = new char[strValue.GetLength()+1];
    for (int i = 0; i < 63; i ++)
    {
       if ( timeSlotInfo )
       {
          strValue.Format("VC12_%02d",i+1);
          strcpy(timeSlotInfo->chTimeSlotName,strValue);
          timeSlotInfo->usTimeSlotData = i+1;
          m_timeSlotInfoArray.Add(timeSlotInfo);
       }
       zeromemory(timeSlotInfo,sizeof(TIMESLOTINFO));
    }
    delete [] timeSlotInfo->chTimeSlotName;
    timeSlotInfo->chTimeSlotName = NULL;
    delete [] timeSlotInfo;
    timeSlotInfo = NULL;机子没VC,没跑过,不知道有没有问题,大概意思就这样
      

  4.   

    针对你现在这个问题,据我所知 _CrtDumpMemoryLeaks() 这玩样如果不放到析构最后都会报你内存泄露的。也就是说跟你函数放的位置有关系。