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が一時的なものであり、スコープ(この場合はforループ)を出ると、そのchharポインターが無効になるためです。

代わりに使用することをお勧めしますdeque<string>。このようにして自分自身をプッシュすると、deque内にlabel実際のコピーが作成されます。label

于 2012-05-11T14:31:50.233 に答える