1

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

4

5 回答 5

5

使用 a 的任何真正理由char*

使用std::string,这将使您的问题消失。

于 2010-10-10T07:01:48.380 回答
1

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

于 2010-10-10T07:01:23.173 回答
1

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

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

typedef std::pair< std::string, int > MyPair;
std::vector< MyPair > data;
于 2010-10-10T07:02:52.563 回答
1

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

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

于 2010-10-10T07:11:37.807 回答
1

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

最好在堆上分配字符串(使用 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 是一种替代方法。

希望这可以帮助!

于 2010-10-10T07:25:51.603 回答