我正在编写一个编译器并使用deque来存储类的方法标签,这里是示例代码:
#include <deque>
#include <iostream>
#include <string>
using std::cout;
using std::deque;
using std::endl;
using std::string;
int main()
{
deque<const char *> names;
string prefix = "___";
const char *classname = "Point";
const char *methodname[] = {"Init", "PrintBoth", "PrintSelf", "equals"};
for (int i = 0; i < 4; i++)
{
string label = prefix + classname + "." + methodname[i];
names.push_back(label.c_str());
}
for (int i = 0; i < 4; i++)
cout << names[i] << endl;
return 0;
}
然而,结果并非我所期望的结果:
___Point
___Point.PrintSelf
___Point.PrintSelf
___Point.equals
另外,我注意到我只是推回了方法名
names.push_back(methodname[i])
我按顺序获取所有方法名称。
我在这里做错了什么?
答案 0 :(得分:9)
for (int i = 0; i < 4; i++)
{
string label = prefix + classname + "." + methodname[i];
names.push_back(label.c_str()); //what you're pushing? a temporary!
} //<--- `label` is destroyed here and it's memory is freed.
此处label
是一个变量,在每次迭代中会在右括号中被销毁并再次创建。
这意味着,您推送到names
的内容是一个临时值。这导致了问题。
我建议你使用它:
std::deque<std::string> names;
然后这样做:
names.push_back(label); //a copy is pushed to the deque!
答案 1 :(得分:0)
这是因为string label
是临时的,一旦退出范围,它的chhar指针就不会有效 - 在这种情况下是for循环。
我建议改用deque<string>
。这样你可以推送label
本身,然后在双端队列中创建label
的真实副本。