2012-11-18 54 views
2

考虑下面的源代码,C++的std ::矢量::引用的push_back参数

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,使我传递参数的副本,而不是引用服用任何想法?任何其他想法也被接受和赞赏。

+6

使用'std :: string'。 – GManNickG

+0

如果你想保留它'szSomething',为什么要删除它? – Mat

+4

失败手动内存管理失败,一如既往。 – Puppy

回答

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"}; 
} 
+0

或'return {“Hello”};':-) –

+0

@KerrekSB:已添加。谢谢。 :-) – Nawaz

3

push_back进行复印您传递的参数。

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

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

1

失败手动内存管理失败,因为它一直如此。使用std::string就像一个理智的人,你会发现你的程序实际上有机会正常运作。

2

push_back()确实复制。在您发布的代码中,您传递的是一个指向空终止字符串的指针,因此C++将指针指向。如果想要一个字符串的副本,你有一些选择:

如果你坚持用C样式空终止字符数组作为字符串,你可以简单地通过在指针和调用删除[]。当然,由于C++只有手动内存管理,你必须确保在稍后但适当的时间调用delete [] ...

其他选项,正如其他人会告诉你的,只是简单地使用std: :串。它会为你管理内存,并将主要“只是工作......”