我在程序中,加入了buf++的语句后,在执行delete []buf 的时候出错,但是如果不buf++,则程序不出错,这是为什么?
char *buf=new char[10];
memset(buf,0,sizeof(buf));
buf[0]='1';
buf[1]='2';
         buf++;
delete [] buf;

解决方案 »

  1.   

    buf++后,指针已经不是原来分配时的指针了。当然会出错。
      

  2.   

    new []除了返回一指针外,编译器实际上还记录了缓冲区的长度,delete []就需要用到此信息,buf++后,执行时就找不到++后的buf所对应的缓冲区长度的信息了,所以出错。
      

  3.   

    注意buf只是一个指针,指的是分配的char的数组的头。
      

  4.   

    memset(buf,0,sizeof(buf));
    中sizeof(buf)=4不是10
      

  5.   

    Debug以后就可以发现,发生错误是因为获得的数组长度为1而不是10。所以可以说是buf++造成了delete无法正确的获得长度。
    可以这么做:
    char *buf = new char[10];
    memset(buf,0,sizeof(buf));
    buf[0]='1';
    buf[1]='2';
    buf++;
    buf--;
    delete []buf;
    上面的程序段是正确的。如果真的要指针读写可以这么做:
    char *buf = new char[10];
    char *Tempbuf = buf;
    memset(buf,0,sizeof(buf));
    buf[0]='1';
    buf[1]='2';
    Tempbuf++;
    delete []buf;
    注意在delete以后Tempbuf也没有意义了。
      

  6.   

    delete []需要的是new []返回的指针。
      

  7.   

    to vcleaner(我没当大哥很久了.......)
      你的这个很正确,没有发现错误,谢谢,不知是否还有更好的办法
      

  8.   

    debug C  runtime library 是会跟踪new的指针的,
    delete的时候是会检查是否是通过new得到的指针release的时候应该不会报错,但是这显然不是什么好事
      

  9.   

    debug状态下,通过CRT提供的new(or malloc),实际都还包含了很多额外信息,
    但是你通过打印处内存中的值就会看得出来:
    char * buf = new char[100];
    int * p = (int*)buf;
    p -= 4;
    printf("(%x,%d)\n",p,*p);
    输出的是100,也就是分配的大小,