char *p=new char[5]; delete p;删除的是什么?难道真的是p本身?p不是分配在栈上的么?测试了一下:
发现,并不是如教材上面所说啊!测试代码如下:#include "conio.h"
#include <iostream.h>int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
int nRetCode = 0;

char *p=new char[5];
for(int i=0;i<5;i++)
{
*(p+i)='a'+i;
} char *p1=p;

delete p;
p=new char[5];  //加不加这一句应该没有影响的啊?

for(i=0;i<5;i++)
{
cout<<*(p1+i);
} cout<<endl; getch();
return nRetCode;
}

解决方案 »

  1.   

    上面漏了一句:delete p;       //加不加这一句应该没有影响的啊?
    p=new char[5];  //加不加这一句应该没有影响的啊?如果真的是只删除p本身,那么上面两句应该都没有影响到啊?但事实是:上面两句话对最终输出结果都有影响!
      

  2.   

    to 小疯子:那么 delete []p 又是干什么的呢?
    delete []p 和  delete p  有啥区别?
      

  3.   

    delete p;       //加不加这一句应该没有影响的啊?不加,内泻.p=new char[5];  //加不加这一句应该没有影响的啊?没有影响,只是又申请了一块内存(在堆上)
      

  4.   

    delete []p 删除数组p和  delete p  删除数组中第一个
      

  5.   

    delete只有一个元素的数组时delete和delete[]是没有区别的,当delete一个包含多个元素的数组时,必须采用delete[]。而delete只对堆内存有作用,delete一个变量是不起作用的,变量的内存并没有释放,值也依然存在。同时delete [] NULL和delete NULL是安全的,但是同一个非NULL地址delete两次是致命的
      

  6.   

    我说的“影响”是指对输出的结果有没有影响。看起来应该输出的是 abcde 吧但是加了delete p 就不对了!