代码如下:
但是现在问题来了,本来我在ppJobs里面只new 了2个元素8*2个字节,但是,当我delete ppJobs时却删除了8*8 个字节。如图:
红色改变的部分是我调用 delete [ ] ppJobs;时改变的内存, 实际上它只需要修改8*2个字节就可以了,很明显, 删除的内存越界了。
接着_ASSERTE( _CrtCheckMemory( ) );中断。
暂时还没有找到好地解决办法。。。
<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->
int
i
=
0
, j
=
0
;
CJob ** ppJobs = NULL;
try
{
int nCount = m_xlist.CountCheckedItems( 0 );
if (nCount)
{
ppJobs = new CJob * [nCount];
for (; i < m_xlist.GetItemCount(); i ++ ) // record all cancel jobs
{
if (m_xlist.GetCheckbox(i, 0 ) == TRUE)
{
CJob * pJob = reinterpret_cast < CJob *> (m_xlist.GetItemData(i));
ppJobs[j] = pJob;
j ++ ;
}
}
for (; j > 0 ; j -- ) // cancel jobs from array
{
ppJobs[j - 1 ] -> Cancel();
}
delete [ ] ppJobs;
pJobs = NULL;
}
}
catch ( ){}
_ASSERTE( _CrtCheckMemory( ) );
做的操作非常的简单,就是把一些CJob类的指针先放到
ppJobs 数组里,然后对CJob做一个cancel的操作,最后释放数组。
CJob ** ppJobs = NULL;
try
{
int nCount = m_xlist.CountCheckedItems( 0 );
if (nCount)
{
ppJobs = new CJob * [nCount];
for (; i < m_xlist.GetItemCount(); i ++ ) // record all cancel jobs
{
if (m_xlist.GetCheckbox(i, 0 ) == TRUE)
{
CJob * pJob = reinterpret_cast < CJob *> (m_xlist.GetItemData(i));
ppJobs[j] = pJob;
j ++ ;
}
}
for (; j > 0 ; j -- ) // cancel jobs from array
{
ppJobs[j - 1 ] -> Cancel();
}
delete [ ] ppJobs;
pJobs = NULL;
}
}
catch ( ){}
_ASSERTE( _CrtCheckMemory( ) );
但是现在问题来了,本来我在ppJobs里面只new 了2个元素8*2个字节,但是,当我delete ppJobs时却删除了8*8 个字节。如图:
红色改变的部分是我调用 delete [ ] ppJobs;时改变的内存, 实际上它只需要修改8*2个字节就可以了,很明显, 删除的内存越界了。
接着_ASSERTE( _CrtCheckMemory( ) );中断。
暂时还没有找到好地解决办法。。。