老问题,哎,内存泄露了.........................

wangsiyuanoo 2008-12-19 03:39:37
我的代码中,先CRole *pRole = new CRole;
再把pRole 放到一个map<long, CRole*>m中。
在这个m的迭代FOR()循环中,我把map中的CRole*指针用list的SetTtemData保存到list中
然后在别的地方,用GetItemData把这些指针取出来
最后把每个指针所代表的信息取出来,一一放到list中显示到界面上。

在析构函数中,这样释放指针
m_NpcList.DeleteAllItems();
for(map<long,CRole*>::iterator iter = m_oAllRole.begin(); iter != m_oAllRole.end(); iter++)
{
delete (*iter).second;
}
m_oAllRole.clear();

可还是引起大量的内存泄露.......................

我把这段内容删除了,就不会有,说明问题出在这。

求解!!!
...全文
225 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
stucsz 2008-12-20
  • 打赏
  • 举报
回复
学习了。
hhyttppd 2008-12-19
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 wangsiyuanoo 的回复:]
引用 13 楼 wiowei 的回复:

能告诉我原因么?
为什么“delete (*iter).second;这个的意思就是释放指针指向的CRole对象,与map容器没什么关系;map容器不需要你释放空间 ”
[/Quote]

因为你保存是对象指针,map只会清理指针(析构时),而不会清理指向的对象
wangsiyuanoo 2008-12-19
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 wiowei 的回复:]
析构是空的那你的CRole有指针成员变量吗?

而且:delete (*iter).second;这个的意思就是释放指针指向的CRole对象,与map容器没什么关系;map容器不需要你释放空间

你不需要释放CRole的话则这段代码本来就不该存在

如果你误删了CRole对象(仍可能需要)的话,有可能相关的其他操作会受牵连,导致一些别的内存泄露
[/Quote]

你说的对诶
把这段删除了,就没泄露了...........

能告诉我原因么?
为什么“delete (*iter).second;这个的意思就是释放指针指向的CRole对象,与map容器没什么关系;map容器不需要你释放空间 ”
wiowei 2008-12-19
  • 打赏
  • 举报
回复
析构是空的那你的CRole有指针成员变量吗?

而且:delete (*iter).second;这个的意思就是释放指针指向的CRole对象,与map容器没什么关系;map容器不需要你释放空间

你不需要释放CRole的话则这段代码本来就不该存在

如果你误删了CRole对象(仍可能需要)的话,有可能相关的其他操作会受牵连,导致一些别的内存泄露
wangsiyuanoo 2008-12-19
  • 打赏
  • 举报
回复
CRole的析构是空的....
我在别的类中用这个类,直接在用的地方释放不就得了,是么?
wiowei 2008-12-19
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 wangsiyuanoo 的回复:]
引用 7 楼 ckt1120 的回复:

Dumping objects ->
{4411} normal block at 0x03230040, 3276800 bytes long.
Data: <                > 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
{4410} n…
[/Quote]
看样子是个类或者结构体,你的CRole析构函数怎么写的?
wiowei 2008-12-19
  • 打赏
  • 举报
回复
VC的提示里面会标出未释放的内存长度,一般看长度就能看出是哪个数据未释放
wangsiyuanoo 2008-12-19
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 ckt1120 的回复:]
引用 4 楼 wangsiyuanoo 的回复:
C/C++ code//这也会引起内存泄露????????
char strTitle[MAX_PATH] = {0};
sprintf(strTitle, "title%d", iColum);


把他注释了就不会有了........


你咋就知道内存泄露了
[/Quote]

输出那会有
Dumping objects ->
{4411} normal block at 0x03230040, 3276800 bytes long.
Data: < > 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
{4410} normal block at 0x03090040, 1638400 bytes long.
Data: < > 01 00 00 00 01 00 00 00 01 00 00 00 01 00 00 00
这些内容
难道不是泄露么?
wjdlt_1997 2008-12-19
  • 打赏
  • 举报
回复
malloc和free,两手抓,两手都要硬
ckt 2008-12-19
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 wangsiyuanoo 的回复:]
C/C++ code//这也会引起内存泄露????????
char strTitle[MAX_PATH] = {0};
sprintf(strTitle, "title%d", iColum);



把他注释了就不会有了........
[/Quote]

你咋就知道内存泄露了
wangsiyuanoo 2008-12-19
  • 打赏
  • 举报
回复
上面的还不对
是这样的

char strTitle[MAX_PATH] = {0};
sprintf(strTitle, "title%d", iColum);

//string strTitleName = STitleIni.ReadText(strTitle, "name"); //注释这句,就不会有内存泄露!不注释,就会有!
int iTitleWidth = STitleIni.ReadInt(strTitle, "width"); //不注释这句,也不会有内存泄露!!!


我糊涂了.................
那两句的作用不是一样的么?
只不过,一个是从配置文件里读字符串,一个是读出int........
wangsiyuanoo 2008-12-19
  • 打赏
  • 举报
回复
上面的不对
是这样

char strTitle[MAX_PATH] = {0};
sprintf(strTitle, "title%d", iColum);

string strTitleName = STitleIni.ReadText(strTitle, "name"); //注释这句,就不会有内存泄露!不注释,就会有!
wangsiyuanoo 2008-12-19
  • 打赏
  • 举报
回复
//这也会引起内存泄露????????
char strTitle[MAX_PATH] = {0};
sprintf(strTitle, "title%d", iColum);


把他注释了就不会有了........
nullah 2008-12-19
  • 打赏
  • 举报
回复
MARK
aqbidt 2008-12-19
  • 打赏
  • 举报
回复
从你的代码看,没有内存泄漏!如果内存少了,应该是STL的alloctor把你的内存缓存起来了
hhyttppd 2008-12-19
  • 打赏
  • 举报
回复
楼主找找别处的吧
你的描述不合情理。

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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