我对基本的C ++用法有疑问。下面的代码,使用gcc / LInux编译,可以正确打印出来。
字符串test
超出范围,因此其c_str()
值应无效,不是吗?我错了还是误解了const char*
含义?
#include <iostream>
int main(){
const char* a = "aaaa";
std::cout << a;
{ std::string test("bbbb");a=test.c_str();}
std::cout << a;
a = "cccc";
std::cout << a;
}
aaaabbbbcccc
// print out without any problem
答案 0 :(得分:13)
你是对的,你的代码无效,因为它使用的是一个生命周期已经结束的对象。它“偶然”起作用,你不能依赖它。
答案 1 :(得分:2)
可能是因为字符串池。毫无疑问,这是未定义的行为。一旦字符串超出范围,我们就不应该使用c_str()输出。
答案 2 :(得分:1)
当string
对象超出范围时,a
指向的内存仍然存在。我不认为标准说明了在字符串被破坏时清除实际内存位置的任何内容。
答案 3 :(得分:1)
程序调用未定义的行为。当程序执行此操作时,编译器可以随意执行任何操作,包括创建一个可以按预期工作的程序。
它运作方式的可能原因如下。在内部块的末尾,test
超出范围并运行其析构函数。这释放了用于保存实际字符串以供其他用途的内存块,但是内存未被清除(这将浪费时间)。由于这样或那样的原因,释放的内存不会在bbbb
打印出来之前重复使用。
(请注意cccc
分配和打印输出有效。)
答案 4 :(得分:0)
由于test
超出范围,您正在做的是未定义的行为。不要假设它将如何运作。
它也可能是段错误,行为仍然是正确的。 UB是UB。