首页
社区
课程
招聘
[讨论]delete的问题
发表于: 2007-10-19 13:03 4521

[讨论]delete的问题

2007-10-19 13:03
4521
如下源码:
void main()
{
        _asm int 3
        int *x=new int[5];
        *x=0x1234;
        *(x+1)=0x5678;
        *(x+2)=0xabcd;
        delete x;
}

汇编代码:
00401000   int         3
00401001   push        14h
00401003   call        0040103B                                ; int *x=new int[5]
00401008   push        eax
00401009   mov         dword ptr [eax],1234h
0040100F   mov         dword ptr [eax+4],5678h
00401016   mov         dword ptr [eax+8],0ABCDh
0040101D   call        00401030                                ; delete x
00401022   add         esp,8
00401025   ret

按理说, delete x只会释放掉指针x所指向的整型数据空间(共4个字节)

但调试时,查看内存数据可以发现:执行delete x一句后,指针x其后的一片连续区域数据空间,全部被释放了,超过了20个字节,这里 delete 有什么名堂?

进一步调试可以发现:delete x 和 delete [] x的反汇编代码代码居然是一样的,不知何故?

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 236
活跃值: (165)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
2
在VC中delete 和 delete[] 等同,但是建议还是要配对写
2007-10-19 16:24
0
雪    币: 266
活跃值: (52)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
3
原来如此,谢谢楼兄解释
2007-10-19 17:03
0
雪    币: 272
活跃值: (143)
能力值: ( LV15,RANK:930 )
在线值:
发帖
回帖
粉丝
4
[QUOTE=nOpnOp;372623]在VC中delete 和 delete[] 等同,但是建议还是要配对写[/QUOTE]

好像在 vc 中也不同吧。
// 试试下面的例子,注意输出结果

#include <stdio.h>

class A
{
public:
        A()
        {
                printf("A() i = %d\n", i);
                i++;
        }

        ~A()
        {
                i--;
                printf("~A() i = %d\n", i);
        }

        static int i;
};
int A::i = 0;

int main()
{
        A* a = new A[5];

        delete []a; // or delete a;

        return 0;
}
2007-10-19 20:35
0
雪    币: 272
活跃值: (143)
能力值: ( LV15,RANK:930 )
在线值:
发帖
回帖
粉丝
5
其他空间应该是调试使用的,防止堆溢出设置的标志。在你申请的时候多申请一些字节
2007-10-19 20:38
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
dummy哥牛啊
对一般的类型,比如int这种是一样的
对struct  class enum这些xx就不一样了
2007-10-20 13:06
0
雪    币: 272
活跃值: (143)
能力值: ( LV15,RANK:930 )
在线值:
发帖
回帖
粉丝
7
恩,是这样:)
2007-10-20 16:14
0
雪    币: 266
活跃值: (52)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
8
看来,delete还真有点名堂,和所学的不一样,不知这是否仅是VC的特点?

测试了几种数据类型,总结如下,请高手指正:

1. 对于char,int,DWORD,等这些简单的数据的类型,delete和delete [] 完全是一样的

2. 对于Struct数据类型,delete和delete [] 好像也是一样的。

3. 对于Class数据类型,如果当初new时,申请的是数组,必须用delete [] 而不能用delete来释放空间。 不然,程序会发生异常。
2007-10-20 21:06
0
游客
登录 | 注册 方可回帖
返回