0

この質問をするのは、ほぼ3行のコードに分離しているためです。したがって、経験が浅いために失敗したことは、おそらく非常に明白なことです。

Movie* ptr;
if(title == r->getItem().getTitle())
{
    ptr = &(r->getItem());
    cout << "Found: " << ptr->getTitle() << "!";
}

本質的に何が起こってtitle == "The Godfather"いるのかというと、それゆえにそれ
r->getItem().getTitle()が戻ってきているのです。しかし、私が理解していないのは、Movieによって返されたオブジェクトを指すポインターを作成しようとすると、そのポインターをr.getItem()使用できないということです。確かに何かがptr->getTitle()割り当てられていましたが、nullを返すようにしようとすると。

一体何が起こっているのですか?

4

3 に答える 3

1

私はあなたがこのようなことをしていると思います

Movie& getItem () {
   Movie m ();
   return m;
}

/* ... */

Movie * p = & (getItem ());

問題は、mがスタックオブジェクトであり、getItemが返された後に失われることです。これはC++でよくある間違いです。

getTitle呼び出しも機能しないはずですが、偶然に機能する可能性があります。

ヒープ上にオブジェクトを作成する必要があります。

これを回避するための私の簡単なルール:10回何をしているのかを考えていない場合を除いて、&演算子を完全に使用しないでください。

于 2012-05-28T08:19:19.520 に答える
0

より多くのコードを投稿する必要があります。ただし、ほとんどの場合、値getItemでオブジェクトを返します。つまり、元のオブジェクトのコピーである一時オブジェクトを返します。割り当て後-この一時オブジェクトは破棄されるため、破棄されたオブジェクト、(潜在的に)アクセスできないメモリを指します。ptr

于 2012-05-28T08:15:22.657 に答える
0

ここでは、いくつかのことが起こっている可能性があります。

  1. getItem()メソッドはMovieクラスを直接返さない場合がありますが、メソッドの定義は何ですか?getTitle()が異なる方法で実装されている継承されたクラスである可能性があります。
  2. クラスへの参照を返す可能性があり、そのクラスはスコープ外になり、メモリエラーが発生します。
  3. getTitle()メソッドは、ストリーミングできるものを返さない場合がありますが、それは本当に文字列ですか?そのメソッドの定義は何ですか?
于 2012-05-28T08:21:35.500 に答える