一般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()的介绍。
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()的介绍。
解决方案 »
- 困难户发帖,如何根据数据库的路径显示图片?
- 非主线程写视图的问题
- 【急】组合框和编辑框绑定的数据初始化问题
- 这个makefile 如何导入到vc里面去呀?
- 一个自动化组件,定义了双接口为出接口,JavaScript和VBScript怎么跟它Advise来连接该组件?
- 一个基础问题,但是如何解决?
- 老式的C函数定义在VC里面使用的问题。
- 找了一个下午的资料还是没有弄明白On_Notify(notifycode,id,func)与On_Control(notifycode,id,func)的区别
- 为什么在debug模式下运行正常,到了release模式下CString变量的值总是<Bad Ptr>?
- WINDOWS编程经典名著下载
- 怎么用右键菜单来控制ListCtrl显示的项数
- 工程属性use mfc in a static library 转化为 use mfc in a shared dll的问题
普通的对象的delete 和delete{]确实是一样的。
当类中有析构函数的时候,你就看到不同了。编译器根据是delete还是delete『} 来生成调用不同次数的 析构函数。而如果还是用delete来删的话,运行时就会出错了。试一下下面这个代码: #include<iostream>
using namespace std;
#include<stdio.h>
#include<stdlib.h>
#include <windows.h> class myint
{
int a; public:
~myint(){
cout << "ddd\n";
}
}; int main()
{
/* 在用delete释放对象数组时,留意不要丢了符号‘[]’。例如 delete []objects; // 正确的用法 delete objects; // 错误的用法 后者相当于delete objects[0],漏掉了另外99个对象。 */
//while(1)
//{
myint *a = new myint[2];
//delete []a;
delete[] a;
//为什么此处加不加[]都不会造成内存泄漏?
//从任务管理器中可以看出,占用内存不会增大
//Sleep(1);
//}
int num;
cin >> num;
return 0;
}
和
(1)+(2)是一样的道理
delete (p);
(delete) p ;
(delete p );:)
我不知道是不是我问题没的讲清楚,还是大家有没有仔细看我对问题的描述!!!
delete与delete[]我知道怎么用。
但是如果按大家说的,delete(p)与delete p;效果一样的话那么:
int *p = new intp[10000];
delete(P);//就等那delete p了,那就是内存没有完全释放了,还残留9999×sizeof(int)字节了
p=NULL;问题来了,我的测试代码就跟上面的一样使用delete(p),为什么内存不会一直增加?
我是在计时器里不断调用这段代码的,可以肯定的是这段代码一直有被调用,我测试过了!
vc 在 new 一块内存的时候,会多申请一块额外的空间,里面记录了你申请的空间的大小。delete 的时候,无论你用 delete,还是delete[] ,vc 都会根据额外的信息释放掉整个空间。delete 与 delete[] 唯一的区别就是调 析构函数的次数 不一样。delete 只调用一次, delete[] 可能会调用多次 析构
所以在 vc 中你调 delete 和 delete[] 效果完全一样
跟
delete (p);
以及:
delete ((p))
完全一样,没有区别。就好像:
x + y
跟
(x) + (y)
完全一样,没有区别。
即使是你自己定义的operator delete(),那也是一种特殊的函数,这个函数的名字就叫“operator delete”,而不叫“delete”。就好像“operator+”不叫“+”。
int *p = new int p[10000];
delete p;
是不会给你留下9999个字节的,编译程序不会傻到这份儿上。其实他和 delete [] p;一样,都给你清理完了,只是在编译的时候给你一个警告。
delete p;会删除释放数组所占的内存,注意:是申请的所有内存也会释放!(这点不同意鹦鹉的说法--漏掉...),但只会调用第一个元素的析构函数(当元素有析构函数的时候)。 因此对于数组,用delete[]更合适一点