std :: vector :: push_back参数引用

时间:2012-11-18 18:51:06

标签: c++ stl parameters reference std

考虑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来复制我传递的参数而不是通过引用获取它的任何想法?任何其他想法也被接受和赞赏。

4 个答案:

答案 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你会发现你的程序实际上有可能正常运作。