C ++在对向量中存储字符串的副本

时间:2010-10-10 06:58:56

标签: c++ vector cstring std-pair

我在一个定义为vector<pair<char *, int> > data;的类中有一个私有属性。我使用data.push_back(make_pair(p, r));向此向量添加数据。后来当我从矢量中获取数据时,我得到了p值的坏数据。返回的数据类似于��U3。我认为这是因为存储了一个指向char数组的指针。我将如何在矢量中存储实际副本。如果它有助于char数组永远不会超过255个字符+ 1为空终止。

5 个答案:

答案 0 :(得分:5)

使用char*的任何真正原因?

使用std::string,这会让你的问题消失。

答案 1 :(得分:1)

看起来你有一个指向p(在当时定义)的指针放在堆栈上。一旦堆栈框架弹出,你仍然有指针,但它指向的内存可能是垃圾。这些悬空指针问题会让人讨厌,所以我建议使用#include <string>中定义的std :: string类来存储字符串数据。

答案 2 :(得分:1)

由于STL基于复制和值语义,因此如果整个字符串(而不仅仅是指向它的指针)存储在容器中(此处为vector),则会更容易。我说“更容易”因为可以在STL容器中保留指针,但是指向的内存必须由用户代码管理。从这个问题来看,它似乎没有完成。

所以,也许您可​​以使用string代替char *,例如:

typedef std::pair< std::string, int > MyPair;
std::vector< MyPair > data;

答案 3 :(得分:1)

如果你有vector<pair<char *, int> >你正在处理裸指针而 需要手动管理字符串的生命周期 。这是一个主要的PITA和 很可能你做错了 (特别是因为你甚至懒得声称做对了,这似乎建议你甚至不知道你必须这样做)。

与其他人一样,我建议你改用vector<pair<std::string, int> >

答案 4 :(得分:1)

您是通过堆栈变量分配字符串并存储它的地址吗?这将导致您从分配的函数返回时描述的问题。

最好在堆上分配字符串(使用new运算符),然后存储堆分配的地址。 e.g。

char* pNext = new char[50];
strcpy(pNext, ...);
data.push_back(make_pair(pNext, r));

您必须使用char数组完成所有工作 - 例如。您必须确保它们被终止,或者在您打印它们时会产生意外的输出结果。

e.g。

pNext[49] = '\0';

另外,请记住,当您完成堆分配的字符串时,您也必须删除它们。因此删除了char *:

delete [] pNext;

正如其他人所说,还有其他字符串实现可以减少您的头痛。

最容易使用的可能是CString,但是会产生开销,包括MFC的实现或ATL的实现。 std :: string's,正如其他人所提到的那样。

希望这有帮助!