游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2447|回复: 6

delete & delete[]

[复制链接]

1

主题

1

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2004-12-6 12:30:00 | 显示全部楼层 |阅读模式
看到一些帖子说delete和delete[]的区别,但有些问题,特发贴讨论。

new 和 delete 归根到底都是C++语法层上的东西,最终由编译器变成函数调用。
然后最终变成 HeapAlloc 和 HeapFree 等API调用,最终在ntdll.dll中执行。

可以从 HeapFree 的参数中看出,释放堆内存时只需提供内存初始地址,不需要提供长度,
所以不存在所谓的“只释放一部分内存”的情况。

delete[] 存在的唯一理由就是要求编译器将内存块解释为一串对象,调用相应的析构函数。
就如同 new[] 的作用就是调用构造函数一样。

如下举例

int* p = new int[100];
delete[] 和 delete 完全一样,都会完全释放内存

class A { }; A* p = new A[100];
delete[] 会完全释放内存,并且调用析构函数100遍
delete 也会完全释放内存,只是不调用析构函数

190

主题

1801

帖子

2096

积分

金牌会员

Rank: 6Rank: 6

积分
2096
QQ
发表于 2004-12-6 12:59:00 | 显示全部楼层

Re:delete & delete[]

delete p point to A will cause error
always delete[] p

20

主题

473

帖子

502

积分

高级会员

Rank: 4

积分
502
发表于 2004-12-6 13:12:00 | 显示全部楼层

Re:delete & delete[]

....用new 和new[] 得到的内存指针是不一样的
new[]得到的指针的前4个字节存放了数组的大小
这样delete[]的时候才知道该释放多少个,或者调用多少次析够函数

28

主题

685

帖子

703

积分

高级会员

Rank: 4

积分
703
发表于 2004-12-6 16:44:00 | 显示全部楼层

Re:delete & delete[]

这是编译器相关的,vc里面两个是一样的。你只看到过一种具体实现。

2万

主题

2万

帖子

6万

积分

论坛元老

Rank: 8Rank: 8

积分
66489
QQ
发表于 2004-12-6 17:09:00 | 显示全部楼层

Re:delete & delete[]

在用new[]弄出来的类,记得一定要用delete[] 删除。

delete的话会只把内存放掉。

17

主题

454

帖子

470

积分

中级会员

Rank: 3Rank: 3

积分
470
发表于 2004-12-6 19:02:00 | 显示全部楼层

Re:delete & delete[]

C++没有保证delete 和 delete[]能同样释放掉所有内存.

0

主题

39

帖子

39

积分

注册会员

Rank: 2

积分
39
发表于 2004-12-7 01:42:00 | 显示全部楼层

Re:delete & delete[]

delete只是释放了指针
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-12-23 15:04

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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