<<--这里一定应该要delete吗?为什么不注释它就会出错? new 分配的空间要 delete 来释放 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 要删除,而且删除的方法是 delete []p; 很简单,不管是否循环都会出错假设一下:p=new char(1024); //p=0x112233;//分配的堆内存p="sssssss'; //p=0x332211;//这是常量字符串的地址delete p;//释放一个不是new分配的地址,不出错才怪! 当然会出错,通过new分配的空间要delete来释放,通过malloc分配的空间则用free来释放。 没错:delete p;//释放一个不是new分配的地址,不出错才怪! memcpy(p,"sssss",1024);//这样就可以了 void a(){ p=new char(1024); p="sssss"; ~~~~~~~~~~~~~~~好像这里就不对了。上面分配的那1K内存已经丢失了,因为你的p改指向了"sssss"这个常量字符串的地址,所以下面的delete会出错。delete只能和new成对使用,释放堆里的内存空间,但是常量字符串"sssss"不是在堆里。至于是不是在栈里,我也不太清楚…… printf(p); //delete p; // <<--这里一定应该要delete吗?为什么不注释它就会出错? //getchar();} p=new char[1024];memcpy(p,"ssssss",1024);delete []p;that is ok! 顺便说一下,p=new char(1024);//是错误的并不是分配一个1024字节的区域而是使用1024去初始化分配的一个字符(会overflow)memcpy(p,"ssssss",1024);//会破坏对内存,当然p="ssss"也不对这是本程序的第二个错误! p = new char[1024];strcpy(p,"sssss");...delete[] p; void a(){ p=new char(1024); p="sssss";//*******去掉 printf(p); //delete p; // <<--这里一定应该要delete吗?为什么不注释它就会出错? //getchar();}在vc编译其中选择MFC库,就没问题了 我试着帮你改一下,可以保持你的意图,又能去掉错误void a(){ p=new char(1024);// p="sssss"; //comment by vince strcpy(p,"sssss"); //add by vince printf(p); delete p; // 这样应该不会出错了} 在vc编译其中选择MFC库,就没问题了真的没问题?只是能编译通过而已,它存在严重的内存泄露问题 #include "stdafx.h"#include "stdio.h"void a(void);char * p;int main(int argc, char* argv[],char * env[]){ for(int i=0;i<999;i++) a(); return 0;}void a(){ p=new char(1024); p="sssss"; printf(p); //delete p; // <<--这里一定应该要delete吗?为什么不注释它就会出错? //getchar();}p=new char(1024); 这句不对,因该是 p = new char[1024]; 如果是上面的写法,你就只分配了一个字符的空间,而下面这句你又将分配的p的地址重新给付值了,而这个地址是一个编译期间就确定的地址但是你下面又用 delete 来释放 p,这肯定会出错的总的来说,你这个程序问题多多 这个是VC自带的宏还是自己定义的宏: #define STRICT 网络数据发送问题 进入OnOK后能不能回到刚才的界面了? CMainFrame中怎样调用自己的消息 关于多线程得学习问题 问一个很白痴的问题 求使用CreateDIBSection显示8位灰度图的例子(不用那种多通道转单通道) 很简单的一个问题啊,解释清楚了一定给分的啊,尽我所能 紧急求助:如何在子线程中调用主程序的其他对话框类? 关于接口id 怎样使VC6支持ConstructString 软件测试的主要方法有哪些啊?
假设一下:
p=new char(1024);
//p=0x112233;//分配的堆内存
p="sssssss';
//p=0x332211;//这是常量字符串的地址
delete p;//释放一个不是new分配的地址,不出错才怪!
{ p=new char(1024);
p="sssss";
~~~~~~~~~~~~~~~好像这里就不对了。上面分配的那1K内存已经丢失了,因为你的p改指向了"sssss"这个常量字符串的地址,所以下面的delete会出错。delete只能和new成对使用,释放堆里的内存空间,但是常量字符串"sssss"不是在堆里。至于是不是在栈里,我也不太清楚……
printf(p);
//delete p; // <<--这里一定应该要delete吗?为什么不注释它就会出错?
//getchar();
}
memcpy(p,"ssssss",1024);
delete []p;that is ok!
p=new char(1024);//是错误的
并不是分配一个1024字节的区域
而是使用1024去初始化分配的一个字符(会overflow)
memcpy(p,"ssssss",1024);//会破坏对内存,当然p="ssss"也不对这是本程序的第二个错误!
strcpy(p,"sssss");
...
delete[] p;
{ p=new char(1024);
p="sssss";//*******去掉
printf(p);
//delete p; // <<--这里一定应该要delete吗?为什么不注释它就会出错?
//getchar();
}
在vc编译其中选择MFC库,就没问题了
void a()
{ p=new char(1024);
// p="sssss"; //comment by vince
strcpy(p,"sssss"); //add by vince
printf(p);
delete p; // 这样应该不会出错了
}
#include "stdio.h"
void a(void);
char * p;
int main(int argc, char* argv[],char * env[])
{
for(int i=0;i<999;i++) a();
return 0;
}
void a()
{ p=new char(1024);
p="sssss";
printf(p);
//delete p; // <<--这里一定应该要delete吗?为什么不注释它就会出错?
//getchar();
}p=new char(1024);
这句不对,因该是 p = new char[1024];
如果是上面的写法,你就只分配了一个字符的空间,而下面这句你又将
分配的p的地址重新给付值了,而这个地址是一个编译期间就确定的地址但是你下面又用 delete 来释放 p,这肯定会出错的总的来说,你这个程序问题多多