为什么将带引号的字符串强转为string&类型会导致程序崩溃?
崩溃根因说明
- 你用到的
(string &)"something"是C风格强制转换,实际等价于reinterpret_cast<std::string&>,作用是完全忽略类型差异,直接将字符串字面量的内存地址,视作std::string对象的首地址进行解释,不会触发任何从const char*到std::string的隐式类型转换,也不会生成临时的std::string对象。 - 字符串字面量和
std::string的内存布局完全不兼容:字符串字面量的类型是const char[N],内存中直接存储连续的字符值+末尾\0;而std::string是类类型,内部存储结构一般是「指向堆内存的字符指针 + 长度 + 容量」,哪怕开启短字符串优化,内部结构也和原生字符数组没有兼容性。
当你调用
str.length()、str[i]等接口时,程序会按照std::string的内存布局去对应偏移位置读成员变量:比如读取长度时,实际读到的是字面量前几个字符ASCII值拼接成的垃圾值;读取字符内容时,会把前几个字符的值当成指针去访问内存,这个指针指向的是完全随机的地址,直接触发非法内存访问导致崩溃。
- 编译无告警的原因:C风格强制转换的优先级高于所有类型安全检查,相当于你主动向编译器声明「我确认这个转换是合法的,忽略所有类型错误」,所以g不会输出任何告警。如果换用C规范推荐的
static_cast做转换,编译器会直接报错阻止这个非法操作。
内容的提问来源于stack exchange,提问作者GaussGun
相关产品推荐
相关产品推荐

