以下代码生成错误的输出:
string my_string="My_First_Text"; char * my_pointer=(char *)(my_string+"My_Second_Text").c_str();
为什么?在我初始化时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
使用命名变量而不是临时变量就可以了.例如
string my_string = "My_First_Text"; my_string += "My_Second_Text"; const char * my_pointer = my_string.c_str();
BTW:std :: basic_string :: c_str的返回类型是const char*
,对它的任何修改都是UB.所以试图char*
明确地将其转换是危险的.
写入通过的字符数组
c_str()
是未定义的行为.