none
delete与delete[] RRS feed

  • 问题

  • char *s=a();
    char *a()
    {char *a=new char[10];return a;}

    想释放s是delete还是delete[],实际程序中我用delete[]最后还是报错内存不能被read.求详解,对这个程序到底是用delete,还是delete[]。而不能用的那一个是什么原因

    2011年7月15日 9:03

答案

  • 检查下是不是你在delete[]操作后,并没有把a设为NULL,又在其他地方引用了a。最好还是new[]申请的空间用delete[]来释放,因为new[]申请的空间其实保存有空间的大小,如果用delete[]可以正确的释放掉对应的内存。如果用delete可能会只是放掉一个char大小的空间,当然这个也和编译器有关。如果用delete[]去释放new申请的空间,也有可能出现不可预料的错误。
    2011年7月20日 16:55
  • 如果只有这几行,是不会报错的呀。

    char *a()
    {char *a=new char[10];return a;}
    int _tmain(int argc, _TCHAR* argv[])
    {
    	char *s=a();
    	delete[] s;
    	return 0;
    }
    

     


    Would you know my name, if I saw you in heaven......
    2011年7月15日 16:08
    版主
  • check if the function a and the caller of a are using the same heap,

    for instance, one if using vc8, one is vc9, or one if debug the other is release,

    especially if they belong to different dlls.

     

    2011年7月18日 21:11
  • 你这个例子应该使用delete [] a;

    而报错是由于,你在delete[]后,没有把a = NULL;

    另外如果你使用的是微软的编译器。对于简单数据类型的指针,无所谓delete[]和delete.delete也可以释放数组。


    麻烦把正确答案设为解答。
    2011年7月19日 3:14
    版主
  • 你写的语句是有错误的, 应该是 s= NULL; a=NULL;另外那个[]是紧跟在delete后的。

    指向同一块地址是一样的,delete[] 对谁操作都是一样的。但是只能操作一次。delete一个已经被delete的指针不好说会有什么情况发生。

    2011年8月3日 8:50

全部回复

  • 如果只有这几行,是不会报错的呀。

    char *a()
    {char *a=new char[10];return a;}
    int _tmain(int argc, _TCHAR* argv[])
    {
    	char *s=a();
    	delete[] s;
    	return 0;
    }
    

     


    Would you know my name, if I saw you in heaven......
    2011年7月15日 16:08
    版主
  • 一般而言,new对应的delete,new[]对应delete[]
    Visual C++ enthusiast, like network programming and driver development. At present is being engaged in the WinCE/Windows Mobile platform embedded development.
    2011年7月16日 4:51
    版主
  • check if the function a and the caller of a are using the same heap,

    for instance, one if using vc8, one is vc9, or one if debug the other is release,

    especially if they belong to different dlls.

     

    2011年7月18日 21:11
  • 你这个例子应该使用delete [] a;

    而报错是由于,你在delete[]后,没有把a = NULL;

    另外如果你使用的是微软的编译器。对于简单数据类型的指针,无所谓delete[]和delete.delete也可以释放数组。


    麻烦把正确答案设为解答。
    2011年7月19日 3:14
    版主
  • 检查下是不是你在delete[]操作后,并没有把a设为NULL,又在其他地方引用了a。最好还是new[]申请的空间用delete[]来释放,因为new[]申请的空间其实保存有空间的大小,如果用delete[]可以正确的释放掉对应的内存。如果用delete可能会只是放掉一个char大小的空间,当然这个也和编译器有关。如果用delete[]去释放new申请的空间,也有可能出现不可预料的错误。
    2011年7月20日 16:55
  • delete[] s;s == NULL;和delete a[];a == NULL一样的吗,指向的是同一块地址
    2011年7月26日 6:40
  • 你写的语句是有错误的, 应该是 s= NULL; a=NULL;另外那个[]是紧跟在delete后的。

    指向同一块地址是一样的,delete[] 对谁操作都是一样的。但是只能操作一次。delete一个已经被delete的指针不好说会有什么情况发生。

    2011年8月3日 8:50
  • 如果指向同一个空间。不用调两次。但是对于VC编译器。如果在delete 后,设置了NULL。不会产生异常。在delete之前对NULL进行了检查。


    麻烦把正确答案设为解答。
    2011年8月4日 4:02
    版主
  • 是的,delete是做空检查的。delete空指针是没有问题的,所以楼主delete后一定要设NULL哦。

    2011年8月4日 4:13