考虑C ++中的以下源代码
vector <char *> myFunction()
{
vector <char *> vRetVal;
char *szSomething = new char[7];
strcpy(szSomething,"Hello!");
vRetVal.push_back(szSomething); // here vRetVal[0] address == &szSomething
delete[] szSomething; // delete[]ing szSomething will "corrupt" vRetVal[0]
szSomething = NULL;
return vRetVal; // here i return a "corrupted" vRetVal
}
关于如何使用push_back来复制我传递的参数而不是通过引用获取它的任何想法?任何其他想法也被接受和赞赏。
答案 0 :(得分:7)
您的推送到向量的指针的对象被代码中的delete
语句破坏。这意味着,向量中的项(指针)指向已删除的对象。我相信你不希望这样。
使用std::string
:
std::vector<std::string> myFunction()
{
std::vector<std::string> v;
v.push_back("Hello");
v.push_back("World");
return v;
}
在C ++ 11中,你可以这样写:
std::vector<std::string> myFunction()
{
std::vector<std::string> v{"Hello", "World"};
return v;
}
或者这个,
std::vector<std::string> myFunction()
{
return {"Hello", "World"};
}
答案 1 :(得分:3)
push_back
将复制您传递的参数。
但是你的参数是指针,而不是字符串本身。
要自动复制字符串,请使用std::string
。
答案 2 :(得分:2)
push_back() 制作副本。在您发布的代码中,您传递一个指向空终止字符串的指针,以便C ++生成指针的副本。如果想要该字符串的副本,您有一些选择:
如果你坚持使用C风格的空终止字符数组作为字符串,你可以简单地传入指针而不调用delete []。当然,由于C ++只有手动内存管理,你必须确保在稍后但适当的时候调用delete [] ......
正如其他人告诉你的那样,另一个选择是简单地使用std :: string。它将为您管理记忆,并且主要是“只是工作......”
答案 3 :(得分:1)
失败手动内存管理失败 - 一如既往。像一个理智的人一样使用std::string
你会发现你的程序实际上有可能正常运作。