一般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()的介绍。

解决方案 »

  1.   

    delete负责调用 类的析构函数的。 
    普通的对象的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; 
      

  2.   

    我要问的不是delete[]使用,请看清我的问题!我是想知道delete()函数与delete[]的区别,与delete()函数到底做了什么?不过,还是谢谢1楼的讲解!!
      

  3.   

    name = new char[ 100 ];delete []name;
      

  4.   

    delete p 不就是delete(p)么。还讲啥?
      

  5.   

    简单的说下,数组有一个特征,就是内存分布是连续的, 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 就被楼主毫无悬念的丢弃了,这段内存泄露了!
      

  6.   

    还是要看数据类型滴 建议看下这个http://www.diybl.com/course/3_program/c++/cppsl/2008520/117243.html
      

  7.   

    new delete 不是函数, 而是运算符, 是operator, 所以delete (p);和delete p;是一样的, 就像 1+2

    (1)+(2)是一样的道理
      

  8.   

    delete [] 用来释放new分配的数组,delete()就是释放当前元素
      

  9.   

    念口诀,记套路。 new 和 delete 是 "操作符"C语言的括号是万精油。 delete p;  可以写 
    delete (p);  
    (delete) p ;
    (delete p );:)
      

  10.   

    谢谢各位关注的朋友!!!!
    我不知道是不是我问题没的讲清楚,还是大家有没有仔细看我对问题的描述!!!
    delete与delete[]我知道怎么用。
    但是如果按大家说的,delete(p)与delete p;效果一样的话那么:
    int *p = new intp[10000];
    delete(P);//就等那delete p了,那就是内存没有完全释放了,还残留9999×sizeof(int)字节了
    p=NULL;问题来了,我的测试代码就跟上面的一样使用delete(p),为什么内存不会一直增加?
    我是在计时器里不断调用这段代码的,可以肯定的是这段代码一直有被调用,我测试过了!
      

  11.   


    vc 在 new 一块内存的时候,会多申请一块额外的空间,里面记录了你申请的空间的大小。delete 的时候,无论你用 delete,还是delete[] ,vc 都会根据额外的信息释放掉整个空间。delete 与 delete[] 唯一的区别就是调 析构函数的次数 不一样。delete 只调用一次, delete[] 可能会调用多次 析构
      

  12.   

    在C++ 里, int 类型没有析构
    所以在 vc 中你调 delete 和 delete[] 效果完全一样
      

  13.   

    delete p;

    delete (p);
    以及:
    delete ((p))
    完全一样,没有区别。就好像:
    x + y

    (x) + (y)
    完全一样,没有区别。
      

  14.   

    delete不是函数,是关键字。
    即使是你自己定义的operator delete(),那也是一种特殊的函数,这个函数的名字就叫“operator delete”,而不叫“delete”。就好像“operator+”不叫“+”。
      

  15.   

    你还有一个误解
    int *p = new int p[10000];
    delete p; 
    是不会给你留下9999个字节的,编译程序不会傻到这份儿上。其实他和 delete [] p;一样,都给你清理完了,只是在编译的时候给你一个警告。
      

  16.   

    delete[]p;删除的时候会调用数组中每一个元素的析构函数(当元素有析构函数的时候)。   
    delete p;会删除释放数组所占的内存,注意:是申请的所有内存也会释放!(这点不同意鹦鹉的说法--漏掉...),但只会调用第一个元素的析构函数(当元素有析构函数的时候)。  因此对于数组,用delete[]更合适一点