我在定义为的类中有一个私有属性vector<pair<char *, int> > data;
。我用 向这个向量添加数据data.push_back(make_pair(p, r));
。后来,当我从向量中获取数据时,我得到了 p 值的错误数据。返回的数据是这样的��U3
。我认为这是因为正在存储指向 char 数组的指针。我将如何在向量中存储实际副本。如果它有帮助,则 char 数组将永远不会超过 255 chars + 1 用于 null 终止。
5 回答
使用 a 的任何真正理由char*
?
使用std::string
,这将使您的问题消失。
看起来好像您有一个指向 p 的指针(当时已定义)放置在堆栈上。一旦堆栈帧被弹出,你仍然有指针,但它指向的内存可能是垃圾。这类悬空指针问题可能会很烦人,所以我建议使用定义的 std::string 类#include <string>
来存储字符串数据。
由于 STL 基于复制和值语义,因此如果将整个字符串(而不仅仅是指向它的指针)存储在容器中(此处为vector
)会更容易。我说“更容易”是因为可以将指针保存在 STL 容器中,但指向的内存必须由用户代码管理。从问题来看,似乎并没有做到。
因此,也许您可以使用string
代替char *
,例如:
typedef std::pair< std::string, int > MyPair;
std::vector< MyPair > data;
如果你有一个vector<pair<char *, int> >
你正在处理裸指针并且需要手动管理你的字符串的生命周期。这是一个主要的 PITA,很可能你做错了什么(特别是因为你甚至没有费心声称这样做是对的,这似乎表明你甚至不知道你必须这样做)。
与其他人一样,我建议您vector<pair<std::string, int> >
改用。
您是否通过堆栈变量分配字符串并存储它的地址?当您从分配的函数返回时,这将导致您描述的问题。
最好在堆上分配字符串(使用 new 运算符),然后存储堆分配的地址。例如
char* pNext = new char[50];
strcpy(pNext, ...);
data.push_back(make_pair(pNext, r));
您必须自己处理 char 数组 - 例如,您必须确保它们以 null 结尾,否则在打印它们时会出现意外的输出结果。
例如
pNext[49] = '\0';
另外,请记住,当您完成堆分配的字符串时,您也必须删除它们。char* 被删除,因此:
delete [] pNext;
正如其他人所说,还有其他字符串实现会减少您的麻烦。
最容易使用的可能是 CString,但会产生包括 MFC 实现或 ATL 实现的开销。正如其他人提到的那样,std::string 是一种替代方法。
希望这可以帮助!