Adm*_*mia 6 c++ string pointers temporary-objects
以下代码生成错误的输出:
string my_string="My_First_Text";
char * my_pointer=(char *)(my_string+"My_Second_Text").c_str();
Run Code Online (Sandbox Code Playgroud)
为什么?在我初始化时my_pointer,我认为my_pointer=new char[100]不需要.如果这个假设不正确,为什么呢?
请注意,这my_string+"My_Second_Text"是一个临时的std::string,将在表达式后立即销毁.这意味着my_pointer将立即悬空,因为它应该指向的char数组随着临时的破坏而被破坏std::string; 请注意,返回的char数组属于std::string,它不是独立的.然后,对悬垂指针的依赖将导致UB.
string my_string="My_First_Text";
char * my_pointer=(char *)(my_string+"My_Second_Text").c_str();
// the temporary constructed from my_string+"My_Second_Text" has been destroyed
// my_pointer is dangled now; deference on it is UB
Run Code Online (Sandbox Code Playgroud)
使用命名变量而不是临时变量就可以了.例如
string my_string = "My_First_Text";
my_string += "My_Second_Text";
const char * my_pointer = my_string.c_str();
Run Code Online (Sandbox Code Playgroud)
BTW:std :: basic_string :: c_str的返回类型是const char*,对它的任何修改都是UB.所以试图char*明确地将其转换是危险的.
写入通过的字符数组
c_str()是未定义的行为.