我在这里做错什么了?显然,当我打电话给getbbb时,aval被改写了。预期产出如下:
test A aval: "aaa"
test B aval: "aaa"实际产出如下:
test A aval: "aaa"
test B aval: "bbb"文件testb.c:
#include <string>
// g++ -o tempa testb.c && ./tempa
std::string getaaa() {
return std::string("aaa");
}
std::string getbbb() {
return std::string("bbb");
}
int main(
int argc, // num args, including pgm name
char * argv[]) // args
{
const char * aval = getaaa().c_str();
printf("test A aval: \"%s\"\n", aval);
getbbb();
printf("test B aval: \"%s\"\n", aval);
return 0;
}发布于 2022-11-03 17:01:12
const char * aval = getaaa().c_str();会导致未定义的行为。
getaaa()返回一个临时string对象,该对象在创建该对象的完整表达式完成(即在;上)时被销毁,该表达式是在您抓取了string的数据指针之后销毁的。因此,指针被悬空,指向已释放的内存。对该指针的任何后续读取都是未定义的行为。
由于来自getaaa()的getaaa()对象在调用getbbb()之前被销毁并释放其数据,因此允许getbbb()为其自己的string对象重用相同的内存。这是不能保证的,但这是可能的(显然是在你的情况下)。
要解决这个问题,请在获取指针之前将临时string对象从getaaa()保存到本地string变量:
const string sval = getaaa();
const char * aval = sval.c_str();
printf("test A aval: \"%s\"\n", aval);
getbbb();
printf("test B aval: \"%s\"\n", aval);https://stackoverflow.com/questions/74306914
复制相似问题