2

考虑以下 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

4 回答 4

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"};
}
于 2012-11-18T18:54:27.043 回答
3

push_back 复制您传递的参数。

但是您的参数是指针,而不是字符串本身。

要自动复制字符串,请使用std::string.

于 2012-11-18T18:55:27.537 回答
2

push_back()确实复制了一份。在您发布的代码中,您将一个指针传递给一个以空字符结尾的字符串,因此 C++ 会复制该指针。如果想要该字符串的副本,您有一些选择:

如果你坚持使用 C 风格的空终止字符数组作为字符串,你可以简单地传入指针而不调用 delete[]。当然,由于 C++ 只有手动内存管理,你必须确保在稍后但适当的时候调用 delete[]...

正如其他人会告诉你的那样,另一种选择是简单地使用 std::string。它将为您管理内存,并且主要是“正常工作......”

于 2012-11-18T19:02:57.397 回答
1

失败的手动内存管理是失败的 - 就像往常一样。像一个理智的人一样使用std::string,你会发现你的程序实际上有机会正常运行。

于 2012-11-18T18:57:31.717 回答