【发布时间】:2014-01-02 12:38:37
【问题描述】:
我们最近在大学举办了一场讲座,教授告诉我们在使用不同语言进行编程时需要注意的不同事项。 以下是 C++ 中的示例:
std::string myFunction()
{
return "it's me!!";
}
int main(int argc, const char * argv[])
{
const char* tempString = myFunction().c_str();
char myNewString[100] = "Who is it?? - ";
strcat(myNewString, tempString);
printf("The string: %s", myNewString);
return 0;
}
这会失败的原因是return "it's me!!" 使用 char[] 隐式调用 std::string 构造函数。该字符串从函数返回,函数c_str()返回指向std::string中数据的指针。
由于函数返回的字符串在任何地方都没有被引用,它应该立即被释放。这就是理论。
但是,让这段代码运行没有问题。 很想听听你的想法。 谢谢!
【问题讨论】:
-
它不是“没有问题地工作”,它只是假装工作。这是未定义的行为,所以任何事情都可能发生。
-
内存分配不同,但这个答案仍然适用:stackoverflow.com/a/6445794/13005
-
@SteveJessop +1,我只是在寻找相同的链接来发布它。
-
@MarounMaroun 说来话长:D 它指的是碳酸水中的碳酸,这与虹吸管有关。 (我第一次用这个名字是匈牙利最受欢迎的iPhone博客Szifon,它的读音很像“iPhone”,所以这是一种双关语。)
-
要获得奖励积分,请询问您的教授为什么不写
strcat(myNewString, yFunction().c_str());。 (提示:临时对象一直存在到完整表达式的末尾,所以尽管这种 kind of 看起来相同,但 100% 是明确定义的)。
标签: c++