C++中局部char数组与字符串字面量作为类成员存储的差异疑问
问题解答
两种写法的差异本质是字符串字面值和栈上局部数组的存储生命周期完全不同,具体解释如下:
1. 局部数组localStr失效的原因
你自己的理解是完全正确的:const char localStr[] = "Hello world!"是在func1的栈帧上分配的内存空间,运行时会把字符串字面值的内容拷贝到这块栈内存里。这块内存的生命周期和func1绑定,当func1执行完成返回后,对应的栈帧会被销毁,内存地址会被后续其他函数的栈帧复用,你保存的指针就变成了野指针,访问自然会得到乱码。
2. 直接传入字符串字面值生效的原因
"Hello world!"属于字符串字面值常量,C++标准明确规定它的存储类别为静态存储期,存储在进程的只读数据段(.rodata段),从程序加载启动到进程完全退出的整个运行周期内,这块内存都会一直有效,不会因为某个函数调用结束就被回收。
你调用f.Set("Hello world!")的时候,传递给Set方法的就是这个静态存储区里字符串的首地址,后续访问这个地址当然能拿到正确的内容。
注意事项
- 字符串字面值存储在只读区域,禁止修改其内容,类似
const char* p = "test"; const_cast<char*>(p)[0] = 'a'的操作属于未定义行为,大概率会直接触发程序崩溃。 - 你当前的代码只是保存了字符串的指针,没有做内容拷贝,这种写法仅在指针指向的内存生命周期长于
Foo对象时才安全,字符串字面值刚好满足这个要求,换成栈内存、或者提前释放的堆内存就会出现野指针问题。
内容的提问来源于stack exchange,提问作者Marc
相关产品推荐
相关产品推荐

