关于指针的delete和重复利用

图片说明

图片说明

要怎么修改程序呢?

我把程序稍微改了一点,没有再报错了。

 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指向了其他空间。