1.下面的程序中为什么在delete指针之后,它还能正确使用?
char* cReturn=new char[];
delete [] cReturn;
if (HttpRequestParser(cHttpContent,cReturn))
{
 ...
}2.为什么程序改成如下形式,delete就报错(Access violation),其中我在HttpRequestParser中修改了*cReturn的值char* cReturn=new char[];
if (HttpRequestParser(cHttpContent,cReturn))
{
 ...
delete [] cReturn;
}

解决方案 »

  1.   

    你要明白一点:
    delete/delete[] 指针  只是释放它所指向的地址,并不改变指针的值,也就是说,如果原来它指的地址是“暗暗暗暗暗暗暗暗”,你delete后,只是把地址释放了,你如再读它,可能会出现不可预知的问题,当然可能某次的结果仍为“暗暗暗暗暗暗暗暗暗暗”。
    针对这种情况,我们应该养成一种习惯,在delete 指针后,接着给指针一个空值(NULL)
      

  2.   

    char* cReturn = new char[];
    .......
    delete []cReturn;
    cReturn = NULL;
      

  3.   

    谢谢subtop(风歌)对第一个问题解说,我明白了
    同时希望还能对第二个问题解惑一下!
      

  4.   

    你的第二个问题我写了一个简化的程序
    没有任何错误呀
    #include <stdio.h>
    #include <windows.h>
    void aa(char *p)
    {
    strcpy(p, "aa");
    }void main()
    {
    char *p = new char[3];
    aa(p);
    delete []p;
    }
      

  5.   

    to 888atao(阿涛) :
    我怀疑是楼主是在 HttpRequestParser(cHttpContent,cReturn)中,
    将cReturn指向的地址改变了,而不是改变了原始cReturn对应地址中的字符串!
    你的是这样,所以通过了!最好请楼主所说的修改cReturn的代码贴出来???
      

  6.   

    char* cReturn=new char[];//没给出数量参数,默认为申请0字节,成功时会返回一个非NULL的指针,但该指针指向的有效的内存数量是0,以后对该指针进行写操作时实际造成越界访问.
    在调试版本中,分配的地址空间附加了4字节作结束符,以0xFD填充,当越界访问时它们有极大可能被改写,在delete操作符中对此4字节进行检查,如果发现有改动则出现ASSERT--Access violation.
    修正:
    #define BUF_LEN 1024
    char *cReturn = new char[BUF_LEN] ;
      

  7.   

    我按照QunKangLi(李群康)的说法试过了,
    原来是这么回事,惭愧,自己要狂补基础啊!
    我的测试代码:(Debug版本,delete时报错)
    char *chTemp = new char[];
    chTemp = "abcdefg";
    AfxMessageBox(chTemp);
    delete [] chTemp;
      

  8.   

    你的测试代码的错处却不止于此:
    char *chTemp = new char[];
    chTemp = "abcdefg";//chTemp指针本身被改变,它指向听内存地址空间实际已无人管理.同时,"abcdefg"是常量,用变量的指针指向它,以后不改写当然没问题,若是有写操作,则又是访问违规.按你所想应该是对字符串赋值,那就该是strcpy( chTemp, "abcdefg" );不可以直接用=操作符.
    AfxMessageBox(chTemp);
    delete [] chTemp;//桃花依旧人不在,物是人非,删除字符串常量,不出错才有鬼.
      

  9.   

    受益匪浅!
    “abcdefg"这种常量被保存在哪里,是内存的什么区呢,这个区大小多大?
      

  10.   

    第二个问题,一定是指针已经改变了!将new和delete都去掉!
      

  11.   

    char* cReturn=NULL;
    if (HttpRequestParser(cHttpContent,cReturn))
    {
     ...
    }
      

  12.   

    我要结贴了:
      第一个问题的正确解释应该属于subtop(风歌)
      第二个问题的正确解释应该属于 QunKangLi(李群康),这个问题中的那个函数实现部分大致入strcpy,还有szclm(IT的民工)所给出的办法,测试没有通过:错误为Access violation,我想还是在取*p值时发生的char* p=NULL;
    change(p);
    delete p;void change(char *p)
    {
     strcpy(p,"adb");
     return;
    }最后谢谢各位的热心!!!!!!
      

  13.   

    我的专家门诊 --> 我的问题 -> 管理