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