1、首先区别以下两种对char*类型变量赋值的区别:
char* name = new char[20];
strcpy_s(name, strlen("hello")+1, "hello");
delete []name;
char* name = new char[20];
name = "hello";
delete []name; //runtime error!!!!
在编译阶段,两段程序没有任何问题,但是在运行时,当执行到delete命令时,第二段程序将会报错:
显示堆指针非法。
2、对错误产生的讨论:
在第二种赋值方法中,
name = "hello";
name为一个字符串型指针,通过赋值指向了在堆(Heap)中一个 字符串常量,相当于const char*,在销毁时,由于其为常量,使得该块内存无法被修改,从而导致内存释放失败。