2

我正在编写一个编译器并使用 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])

我按顺序获取所有方法名。

我在这里做错了什么?

4

2 回答 2

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!
于 2012-05-11T14:29:25.910 回答
0

这是因为它string label是一个临时的,并且它的 chhar 指针在它退出范围后无效 - 在这种情况下是 for 循环。

我建议deque<string>改用。这样你就可以推送label自己,然后label在双端队列中创建一个真实的副本。

于 2012-05-11T14:31:50.233 回答