我正在编写一个编译器并使用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;
}
Run Code Online (Sandbox Code Playgroud)
但是,结果并不是我所期望的:
___Point
___Point.PrintSelf
___Point.PrintSelf
___Point.equals
Run Code Online (Sandbox Code Playgroud)
另外,我注意到我只是推回了methodname
names.push_back(methodname[i])
Run Code Online (Sandbox Code Playgroud)
我按顺序获得所有方法名称.
我在这做错了什么?
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.
Run Code Online (Sandbox Code Playgroud)
这label是一个变量,它在闭合括号中被破坏,并在每次迭代中再次创建.
这意味着,你所追求的names是一个暂时的价值.这导致了问题.
我建议你用这个:
std::deque<std::string> names;
Run Code Online (Sandbox Code Playgroud)
然后这样做:
names.push_back(label); //a copy is pushed to the deque!
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1434 次 |
| 最近记录: |