要怎么修改程序呢?
我把程序稍微改了一点,没有再报错了。
char *ps=new char[5];
ps[0]='e';
ps[1]='g';
ps[2]='g';
ps[3]='\0';
//ps="egg";
cout<<ps<<" and its address is "<<(int *)ps<<endl;
delete []ps;
ps=new char[6];
ps[0]='c';
ps[1]='a';
ps[2]='t';
ps[3]='\0';
//ps="cat";
cout<<ps<<" and its address is "<<(int *)ps<<endl;
delete []ps;
ps是char *,不是int *
一个char是一个字节,一个int是4个字节,你那么写相当于越界了。
你得写int而不是int *
ps在用"egg"赋值后,它的地址改变了,变成了"egg"的地址,而不是原来new出来的地址,delete []ps释放的就不是new出来的,所以报错了。
用这个代码测试一下你大概就能明白
char *ps=new char[5];
ps[0]='e';
ps[1]='g';
ps[2]='g';
ps[3]='\0';
cout<<ps<<" and its address is "<<(int *)ps<<endl;
char *str=ps="egg";
cout<<ps<<" and its address is "<<(int *)ps<<endl;
cout<<str<<" and its address is "<<(int *)str<<endl;
ps="cat"那一句的写法有问题的,就算编译器不报错,那一句也会造成内存泄露。ps一开始指向你new出来的char [6]的空间,结果你没有delete就将ps指向了其他空间。