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;
}
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;
}
delete/delete[] 指针 只是释放它所指向的地址,并不改变指针的值,也就是说,如果原来它指的地址是“暗暗暗暗暗暗暗暗”,你delete后,只是把地址释放了,你如再读它,可能会出现不可预知的问题,当然可能某次的结果仍为“暗暗暗暗暗暗暗暗暗暗”。
针对这种情况,我们应该养成一种习惯,在delete 指针后,接着给指针一个空值(NULL)
.......
delete []cReturn;
cReturn = NULL;
同时希望还能对第二个问题解惑一下!
没有任何错误呀
#include <stdio.h>
#include <windows.h>
void aa(char *p)
{
strcpy(p, "aa");
}void main()
{
char *p = new char[3];
aa(p);
delete []p;
}
我怀疑是楼主是在 HttpRequestParser(cHttpContent,cReturn)中,
将cReturn指向的地址改变了,而不是改变了原始cReturn对应地址中的字符串!
你的是这样,所以通过了!最好请楼主所说的修改cReturn的代码贴出来???
在调试版本中,分配的地址空间附加了4字节作结束符,以0xFD填充,当越界访问时它们有极大可能被改写,在delete操作符中对此4字节进行检查,如果发现有改动则出现ASSERT--Access violation.
修正:
#define BUF_LEN 1024
char *cReturn = new char[BUF_LEN] ;
原来是这么回事,惭愧,自己要狂补基础啊!
我的测试代码:(Debug版本,delete时报错)
char *chTemp = new char[];
chTemp = "abcdefg";
AfxMessageBox(chTemp);
delete [] chTemp;
char *chTemp = new char[];
chTemp = "abcdefg";//chTemp指针本身被改变,它指向听内存地址空间实际已无人管理.同时,"abcdefg"是常量,用变量的指针指向它,以后不改写当然没问题,若是有写操作,则又是访问违规.按你所想应该是对字符串赋值,那就该是strcpy( chTemp, "abcdefg" );不可以直接用=操作符.
AfxMessageBox(chTemp);
delete [] chTemp;//桃花依旧人不在,物是人非,删除字符串常量,不出错才有鬼.
“abcdefg"这种常量被保存在哪里,是内存的什么区呢,这个区大小多大?
if (HttpRequestParser(cHttpContent,cReturn))
{
...
}
第一个问题的正确解释应该属于subtop(风歌)
第二个问题的正确解释应该属于 QunKangLi(李群康),这个问题中的那个函数实现部分大致入strcpy,还有szclm(IT的民工)所给出的办法,测试没有通过:错误为Access violation,我想还是在取*p值时发生的char* p=NULL;
change(p);
delete p;void change(char *p)
{
strcpy(p,"adb");
return;
}最后谢谢各位的热心!!!!!!