游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3334|回复: 8

堆内存释放

[复制链接]

29

主题

107

帖子

107

积分

注册会员

Rank: 2

积分
107
发表于 2010-7-13 22:38:00 | 显示全部楼层 |阅读模式
通常我们都是[来源:GameRes.com]这样释放对象的:
A* obj = new A();
delete obj;
不知道能否这样释放
class A
{
  int a;
  public:
    void Release()
    {
       delete this;
    }
};

A* obj = new A();
obj->Release();
我自己试了一下貌似可以,但不知道是否存在不安全因素

86

主题

2251

帖子

2386

积分

金牌会员

Rank: 6Rank: 6

积分
2386
QQ
发表于 2010-7-13 23:36:00 | 显示全部楼层

Re:堆内存释放

的确释放了。不建议这么做,小心用倒也凑合着。

248

主题

2674

帖子

2702

积分

金牌会员

Rank: 6Rank: 6

积分
2702
QQ
发表于 2010-7-14 13:57:00 | 显示全部楼层

Re:堆内存释放

在内部消灭自己,从直觉上讲很别扭。

86

主题

2251

帖子

2386

积分

金牌会员

Rank: 6Rank: 6

积分
2386
QQ
发表于 2010-7-15 00:11:00 | 显示全部楼层

Re:堆内存释放

我记得BCB的库里就有这种自杀的东西

3

主题

101

帖子

101

积分

注册会员

Rank: 2

积分
101
发表于 2010-7-15 09:58:00 | 显示全部楼层

Re:堆内存释放

这样不安全,如果该对象是在另一个堆中分配的,这样是不能自己释放的,会crash.

29

主题

107

帖子

107

积分

注册会员

Rank: 2

积分
107
 楼主| 发表于 2010-7-17 16:49:00 | 显示全部楼层

Re:堆内存释放

谢谢大家学习了~

3

主题

263

帖子

267

积分

中级会员

Rank: 3Rank: 3

积分
267
发表于 2010-7-21 21:22:00 | 显示全部楼层

Re:堆内存释放

呵呵,差不多.可以的.
有的时候就是需要在堆里面创建,比如COM对象,
你没见过delete 一个d3d设备或者纹理或者顶点缓冲吧,全部都是 调用Release接口的.不调用的话,当然就是内存泄露了.因为Release内部也是类似的操作.

比如你自己用DLL封装了一个纯虚类供第三方使用,为了隐藏细节,真正的类成员变量完全不可见的时候,这样子会比较好.
当然带来的问题是第三方调试的问题,比如用DX(COM)的时候,一般是看不到IDirect3DDevice的成员变量的.

30

主题

422

帖子

433

积分

中级会员

Rank: 3Rank: 3

积分
433
发表于 2010-7-21 22:43:00 | 显示全部楼层

Re:堆内存释放

语法上没问题,运行恐怕大部分情况也正常。
不过建议你要封装delete的话,顺带把new也一起封装了。
因为new和delete要配对。
你无法知道你的对象是否通过其它重载了的new来创建,而此时你的delete已经被固定下来了。
于是new和delete可能没有配对。

29

主题

107

帖子

107

积分

注册会员

Rank: 2

积分
107
 楼主| 发表于 2010-7-25 12:19:00 | 显示全部楼层

Re:堆内存释放

8楼说的也有道理,谢谢你了
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-11-22 16:32

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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