delete()函数的疑问

huziwu 2009-08-05 04:24:00
一般new跟delete是配对使用的。查了相关资料,得到的结果是
new + 类型 配对 delete + 指针名;
new + 类型[n] 配对 delete[] + 指针名;

int *p = new int;//释放时用 delete p,p=NULL;
int *p = new int[10];//释放时用 delete[] p,p=NULL;
上面的我已经弄明白。

现在我不明白的是,在我的代码中,我是这样用的

//申请内存
int *p = new int[10000];//释放时用 delete(p) ,p=NULL;

...//对p进行操作

//操作完成后释放
delete(p);//原来不知道正确的做法要用delete[] p;
p=NULL;

程序运行时这段代码不断被调用,通过任务管理器查看,内存能够被释放,即内存的使用很稳定。
现在想知道delete(p)与delete[] p;到底有什么区别?
使用delete(p)会不会存在什么风险?
我猜想delete()应该是c函数,而delete则是c++关键字,但是查找MSDN与在网上都找不到delete()的介绍。
...全文
403 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
huziwu 2009-08-06
  • 打赏
  • 举报
回复
明白了,非常感谢各位的谢心帮助!
bohut 2009-08-05
  • 打赏
  • 举报
回复
delete[]p;删除的时候会调用数组中每一个元素的析构函数(当元素有析构函数的时候)。
delete p;会删除释放数组所占的内存,注意:是申请的所有内存也会释放!(这点不同意鹦鹉的说法--漏掉...),但只会调用第一个元素的析构函数(当元素有析构函数的时候)。 因此对于数组,用delete[]更合适一点
dronly 2009-08-05
  • 打赏
  • 举报
回复
学习了。
副组长 2009-08-05
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 huziwu 的回复:]
谢谢各位关注的朋友!!!!
我不知道是不是我问题没的讲清楚,还是大家有没有仔细看我对问题的描述!!!
delete与delete[]我知道怎么用。
但是如果按大家说的,delete(p)与delete p;效果一样的话那么:
int *p = new intp[10000];
delete(P);//就等那delete p了,那就是内存没有完全释放了,还残留9999×sizeof(int)字节了
p=NULL;

问题来了,我的测试代码就跟上面的一样使用delete(p),为什么内存不会一直增加?
我是在计时器里不断调用这段代码的,可以肯定的是这段代码一直有被调用,我测试过了!
[/Quote]
你还有一个误解
int *p = new int p[10000];
delete p;
是不会给你留下9999个字节的,编译程序不会傻到这份儿上。其实他和 delete [] p;一样,都给你清理完了,只是在编译的时候给你一个警告。
晨星 2009-08-05
  • 打赏
  • 举报
回复
delete不是函数,是关键字。
即使是你自己定义的operator delete(),那也是一种特殊的函数,这个函数的名字就叫“operator delete”,而不叫“delete”。就好像“operator+”不叫“+”。
晨星 2009-08-05
  • 打赏
  • 举报
回复
delete p;

delete (p);
以及:
delete ((p))
完全一样,没有区别。

就好像:
x + y

(x) + (y)
完全一样,没有区别。
marrco2005 2009-08-05
  • 打赏
  • 举报
回复
在C++ 里, int 类型没有析构
所以在 vc 中你调 delete 和 delete[] 效果完全一样
marrco2005 2009-08-05
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 huziwu 的回复:]
谢谢各位关注的朋友!!!!
我不知道是不是我问题没的讲清楚,还是大家有没有仔细看我对问题的描述!!!
delete与delete[]我知道怎么用。
但是如果按大家说的,delete(p)与delete p;效果一样的话那么:
int *p = new intp[10000];
delete(P);//就等那delete p了,那就是内存没有完全释放了,还残留9999×sizeof(int)字节了
p=NULL;

问题来了,我的测试代码就跟上面的一样使用delete(p),为什么内存不会一直增加?
我是在计时器里不断调用这段代码的,可以肯定的是这段代码一直有被调用,我测试过了!
[/Quote]

vc 在 new 一块内存的时候,会多申请一块额外的空间,里面记录了你申请的空间的大小。delete 的时候,无论你用 delete,还是delete[] ,vc 都会根据额外的信息释放掉整个空间。delete 与 delete[] 唯一的区别就是调 析构函数的次数 不一样。delete 只调用一次, delete[] 可能会调用多次 析构
huziwu 2009-08-05
  • 打赏
  • 举报
回复
谢谢各位关注的朋友!!!!
我不知道是不是我问题没的讲清楚,还是大家有没有仔细看我对问题的描述!!!
delete与delete[]我知道怎么用。
但是如果按大家说的,delete(p)与delete p;效果一样的话那么:
int *p = new intp[10000];
delete(P);//就等那delete p了,那就是内存没有完全释放了,还残留9999×sizeof(int)字节了
p=NULL;

问题来了,我的测试代码就跟上面的一样使用delete(p),为什么内存不会一直增加?
我是在计时器里不断调用这段代码的,可以肯定的是这段代码一直有被调用,我测试过了!
副组长 2009-08-05
  • 打赏
  • 举报
回复
念口诀,记套路。 new 和 delete 是 "操作符"

C语言的括号是万精油。 delete p; 可以写
delete (p);
(delete) p ;
(delete p );

:)
jasonM2008 2009-08-05
  • 打赏
  • 举报
回复
牛人都来了,望项背!!
oyljerry 2009-08-05
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 huziwu 的回复:]
我要问的不是delete[]使用,请看清我的问题!

我是想知道delete()函数与delete[]的区别,与delete()函数到底做了什么?

不过,还是谢谢1楼的讲解!!
[/Quote]
delete [] 用来释放new分配的数组,delete()就是释放当前元素
zyq1600356618 2009-08-05
  • 打赏
  • 举报
回复
new delete 不是函数, 而是运算符, 是operator, 所以delete (p);和delete p;是一样的, 就像 1+2

(1)+(2)是一样的道理
yuhudie203 2009-08-05
  • 打赏
  • 举报
回复
还是要看数据类型滴 建议看下这个http://www.diybl.com/course/3_program/c++/cppsl/2008520/117243.html
spring203 2009-08-05
  • 打赏
  • 举报
回复
简单的说下,数组有一个特征,就是内存分布是连续的, new 出来的也是这样, 其实delete[] p(如int* p = new int[100]) 完整的写法就是delete[100] p(重载‘[]’,int a[] = {0, 1, 3};),而我们这里的p从就是一个首地址,根据数组指针的含义,就是处理p 到 p++99,delete(p)就是删除p 这一个(首地址),而p++1 到p++99 就被楼主毫无悬念的丢弃了,这段内存泄露了!
danxuezx 2009-08-05
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 huziwu 的回复:]
我要问的不是delete[]使用,请看清我的问题!

我是想知道delete()函数与delete[]的区别,与delete()函数到底做了什么?

不过,还是谢谢1楼的讲解!!
[/Quote]
我觉得1楼讲的很清楚了啊,正好回答了您的问题。
快乐鹦鹉 2009-08-05
  • 打赏
  • 举报
回复
delete p 不就是delete(p)么。还讲啥?
用户 昵称 2009-08-05
  • 打赏
  • 举报
回复
name = new char[ 100 ];

delete []name;
danxuezx 2009-08-05
  • 打赏
  • 举报
回复
谢谢快乐鹦鹉的讲解,原来有这么一段奇妙的玄机!
huziwu 2009-08-05
  • 打赏
  • 举报
回复
我要问的不是delete[]使用,请看清我的问题!

我是想知道delete()函数与delete[]的区别,与delete()函数到底做了什么?

不过,还是谢谢1楼的讲解!!
加载更多回复(2)

16,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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