我自己的内存不能我自己释放?

bigjim 2000-09-11 07:58:00
我第一次使用CStringMapToPtr,用CString作为关键字存储结构体,结构体所用的内存是新分配的。在程序结束时,我除了删除映射类中的元素外,还要释放为结构体申请的内存,但是...竟然内存冲突!我跟踪过,我要delete的指针正是我new来的。真是奇怪!高手们这是怎么回事?
...全文
277 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
bigjim 2000-09-12
  • 打赏
  • 举报
回复
感谢各位大虾了,昨天事情解决了,不过有点出人意料,没想到问题的真正原因竟然是我在给分配的内存赋值的时候越界了,但当时什么错误都没有,直到释放的时候。不过sunqi的回答给了我很大的启示,我马上会给分的。
sunqi 2000-09-11
  • 打赏
  • 举报
回复
for(int i = 0;i < m_tradecol.GetCount();i ++)
{//采用遍历释放所有内存
m_tradecol.GetNextAssoc(pos,PriID,buf);
m_tradecol.RemoveKey(PriID);
delete [] buf; //在这行出错
}
这种方法是不对的,i在增加,m_tradecol.GetCount()在减小
即使不出错也无法释放全部内存,可以用以下方法
for( pos = map.GetStartPosition(); pos != NULL; )
{
map.GetNextAssoc( pos, key, buf);
map.RemoveKey(key);
delete []buf;
}
但是
m_tradecol.RemoveKey(PriID);
delete [] buf; 不应该有错

我写了一小段代码测试,没有问提,可参考
CMapStringToPtr map;
char *buf=new char[100];
strcpy(buf,"1111");
map.SetAt("11",buf);
buf=new char[100];
strcpy(buf,"2222");
map.SetAt("22",buf);
buf=new char[100];
strcpy(buf,"3333");
map.SetAt("33",buf);
POSITION pos;
CString key;
void *ptr;
for( pos = map.GetStartPosition(); pos != NULL; )
{
map.GetNextAssoc( pos, key, ptr);
map.RemoveKey(key);
delete []ptr;
}
bigjim 2000-09-11
  • 打赏
  • 举报
回复
诸位大虾帮忙看看!
bigjim 2000-09-11
  • 打赏
  • 举报
回复
RedFire:我是要对映射中的每一项都要释放内存,因为每一次循环得到的buf都是不一样的。
而且,你说的也解决不了问题。
RedFire 2000-09-11
  • 打赏
  • 举报
回复
你好,你只要把delete [] buf放到循环外面就行了。自己想一想,应该明白为什么了吧!
bigjim 2000-09-11
  • 打赏
  • 举报
回复
char * pTrade = new char[FIXED_SIZE +
trade.OrderInfo.GetLength() + trade.TradInfo.GetLength() + 8]; //分配用来存放交易的内存
ZeroMemory(pTrade,FIXED_SIZE + trade.OrderInfo.GetLength() + trade.TradInfo.GetLength() + 8);
memcpy(pTrade,trade.AccountId,8);//映射里面存贮信息为
//帐号+交易描述
....//拷贝各个成员
m_tradecol.SetAt(temp,pTrade);//m_tradecol是一个映射
//用PrivateID作为关键字插入到映射里面,以后可以用关键字进行快速查找

//以下是退出时的代码
POSITION pos = m_tradecol.GetStartPosition();
void *buf;
CString PriID;
for(int i = 0;i < m_tradecol.GetCount();i ++)
{//采用遍历释放所有内存
m_tradecol.GetNextAssoc(pos,PriID,buf);
m_tradecol.RemoveKey(PriID);
delete [] buf; //在这行出错
}
大虾,代码我贴出来了,请帮忙分析以下
sxbyl 2000-09-11
  • 打赏
  • 举报
回复
不会啊,CMapStringToPtr我用过好多遍,没出过问题。你把删除元素和释放内存的那部分贴出来看看。
zzh 2000-09-11
  • 打赏
  • 举报
回复
先删除指针,然后再RemoveKey,这样就不会有问题了。

16,471

社区成员

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

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

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