1 2 3 4 5 6 7 | int main() { char * str = new char[32]; str = "Hello, Piggy!"; return 0; } |
这样是会内存泄漏的……而我一直都不知道……
1 2 3 4 5 6 7 8 9 10 11 12 | .LC0: .string "Hello, Piggy!" .text .globl main .type main, @function main: andl $-16, %esp subl $32, %esp movl $32, (%esp) call _Znaj movl %eax, 28(%esp) movl $.LC0, 28(%esp) ;把str给覆盖了 |
不过想来也自然,因为这样是允许的,char *str = “Hello, Piggy!”;,“程序中的字符串被存放在常量存储区”不要把这句话当成耳旁风,谨记。

是因为没有delete么?
常量存储区是什么样的?
str内容被字符串的地址覆盖了,想delete就不成了。这里需要用strcpy
和全局存储区静态存储区是一回事了,就是编译期决定,运行时始终存在且其大小不变的一块或者几块内存,如果是只读的就被叫做常量区了。
是不是说
初始化时str得到一个地址
用字符串赋值时又得到另一个
然后这时再delete
会释放常量存储区?
那就出错了,delete只能释放堆上已经分配的空间的空间
哦
那就runtime error呗?
是不是用
char str[] = new char[32];
str = “Hello,world!”;
就可以了?
你真牛掰!char[]能和char*一样吗?
应该是段错误什么的了……
char[]只能在栈中,而且char str[]里面str是个常量。不过void fun(char[])比较特殊,这里就是一个char*。
哦 糊涂了
我白痴了
严重同意!