游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2901|回复: 9

关于内存分配和删除的问题的讨论。

[复制链接]

22

主题

144

帖子

193

积分

注册会员

Rank: 2

积分
193
发表于 2007-9-20 23:58:00 | 显示全部楼层 |阅读模式
我曾写过一些代码,比如实现一个俄罗斯方块,那些方块总是要分配、删除、再分配。
然后删除的时候就出现过一些奇怪的ASSERT

代码大概意图如下:

int* p=new p[3]
int* q=p+1;
  ....
delete q; //some assert was validating

当时我是没有想到关于heap的问题,一直想了好久才从发现,在堆里的指针一对一的分配,然后一对一的释放,heap只管指针的值和对应的大小,所以我这里犯了一个致命的错误,将heap的行为看得过于智能化。

所以才会出现,ASSERT说这指针是假的问题。

可是有的时候,debug版本调试不行,到了release版本却可以了(当然上述简化版本的代码不行),不知道为什么,是因为在debug中有ASSERT,而release版本没有么?

究竟debug的heap和release版本的heap的行为究竟有什么不同呢?

希望大家讨论讨论。 [em13]

1

主题

36

帖子

1442

积分

金牌会员

Rank: 6Rank: 6

积分
1442
发表于 2007-9-21 11:53:00 | 显示全部楼层

Re:关于内存分配和删除的问题的讨论。

这样删除本来就是错误的,出现ASSERT一点不奇怪啊。
另外删除数组用 delete[] p;
“将heap的行为看得过于智能化”?? 你可以想想如果你这样写
代码也能可以正确的话系统需要怎么做。
本来只需一个查HASH表的操作变成了需要遍历整个内存分配列表。
那不叫智能,那叫放任XX。

54

主题

2917

帖子

3765

积分

论坛元老

Rank: 8Rank: 8

积分
3765
QQ
发表于 2007-9-21 12:06:00 | 显示全部楼层

Re:关于内存分配和删除的问题的讨论。

写程序还是要规矩一点,在你的机器上release版本没事,但在其他的机器就未必了。

22

主题

144

帖子

193

积分

注册会员

Rank: 2

积分
193
 楼主| 发表于 2007-10-1 23:03:00 | 显示全部楼层

我是LZ。。。。

置顶一下,希望有人能说说……

149

主题

4981

帖子

5033

积分

论坛元老

Rank: 8Rank: 8

积分
5033
QQ
发表于 2007-10-1 23:46:00 | 显示全部楼层

Re:关于内存分配和删除的问题的讨论。

int *p= new int[100];
delete p+1;
因为p所指的是一个数组,此时单独delete这个数组中的一个元素的代码行为是“未定义”,记得在一本书看过这么一段话:
未定义的含义是:你编译时不会出错,测试时不会出错,在给客户演示时也不会出错,在客户实际使用的时候、最不能出错的时候它会出错……
原话忘了,大致是这意思,就是不要使用这些行为未定义的东东……

45

主题

1163

帖子

1165

积分

金牌会员

Rank: 6Rank: 6

积分
1165
发表于 2007-10-2 19:18:00 | 显示全部楼层

Re:关于内存分配和删除的问题的讨论。

俄罗斯方块也要频繁的分配内存?您需要重新您的设计了,这是我写的俄罗斯方块,不赚气的话可以看看:
http://upload.programfan.com/upfile/200709291558143.rar

22

主题

144

帖子

193

积分

注册会员

Rank: 2

积分
193
 楼主| 发表于 2007-10-7 23:07:00 | 显示全部楼层

Re:小小C

我下载了看了一下,可惜我不懂3D的,不好意思。

如果你预先分配,如果玩家玩一个小时不死的话,怎么办?如果玩一分钟就死了,又怎么办?
你是分配多少呢?这个度不好掌握吧,我一开始就是这么设计的,不是预先分配,而是动态的,程序最大占用内存是依据玩家的水平,因为os会根据最大曾经的heap segments进行回收(这里意思不好表达)。

3

主题

31

帖子

31

积分

注册会员

Rank: 2

积分
31
发表于 2007-10-8 12:11:00 | 显示全部楼层

Re: Re:小小C

flarez: Re:小小C

我下载了看了一下,可惜我不懂3D的,不好意思。

如果你预先分配,如果玩家玩一个小时不死的话,怎么办?...

俄罗斯方块是往一个空间中填充方块对吧
那么只需要分配该空间所需要的内存
然后往这个内存中填数据 根均数据来画不就行了吗

119

主题

1367

帖子

1393

积分

金牌会员

Rank: 6Rank: 6

积分
1393
发表于 2007-10-8 13:50:00 | 显示全部楼层

Re:关于内存分配和删除的问题的讨论。

你要释放的一定需要是一个动态内存区域的入口的位置,否则是非安全地址,当然不能释放了。
release版本对很多安全方面的东西都不做效验,所以开发阶段还是用debug模式的好。
debug版本的运行效率肯定比release的低。
如果debug都能运行的很稳定很畅快,那release模式一定会更好。

6

主题

307

帖子

309

积分

中级会员

Rank: 3Rank: 3

积分
309
发表于 2007-10-8 17:09:00 | 显示全部楼层

Re:关于内存分配和删除的问题的讨论。

release不报错不代表没有问题

你运行上几天看看

debug会对很多潜在问题报错的
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-6-20 19:19

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表