0

私はC++の勉強を始めたばかりで、今はポインターを使って作業しています。なぜ次のようなことが起こっているのか理解できません。

したがって、2つのクラスAとBがあるとします。Aには整数フィールド(int valueA)があり、Bには(Aへの)ポインターフィールドA*aがあります。以下に両方のクラスを示しました。

class A{
   A::A(int value){
    valueA = value;
}


 void A::displayInfo (){
      cout<<A<<endl;
    }
 }



class B{

    B::B(){
    a=0;
  }


  void B::printInfo (){
       a -> displayInfo(); //Segmentation fault
     }

  void B::process(){
     A new_A = A(5);
     a = &new_A;
     new_A.displayInfo(); //correct output
     a -> displayInfo();  //correct output
     }
  }

ここで、メインクラスで、次のことを行います。Bクラスのインスタンスを作成し、process()関数とprint()関数を呼び出します。出力では、5(正しい)、5(正しい)、およびセグメンテーション違反が発生します。誰かが私がこれが起こっている理由を理解するのを手伝ってもらえますか?私の現在のポインターの理解によると、私は正しいことをしていますか?

int main(void){

B b_object();
b_object.process();
b_object.print();

}


これを明確にするために、「intvalueA;」を宣言するAhおよびBhファイルがあります。および「A*a;」それぞれ。そして、私はこれがポインターなしではるかに簡単にできることを知っています、しかし私はここでポインターがどのように機能するかを学ぼうとしています:D

4

3 に答える 3

3
 A new_A = A(5);
 a = &new_A;

ここnew_Aでは、ローカルを作成しprocess、そのアドレスをに割り当てますaprocess関数が終了すると、new_Aスコープ外になり、破棄されます。ここaで、無効なオブジェクトを指しています。

ここでの本当の解決策は、このようなポインターを使用しないことですが、本当に必要な場合は、関数の終わりを超えて何かを持続させるために、動的に割り当てる必要があります。でこれを行いa = new A(5);ます。プログラムの後半で確認する必要がありますdelete a;。そうしないと、動的に割り当てられたメモリがリークされます。

于 2013-02-16T16:11:21.047 に答える
0

aはprocess()でローカル変数に割り当てられるため、printInfo()では無効です。

于 2013-02-16T16:02:22.863 に答える
0

変数aはメソッドに対してローカルです-クラスレベルで宣言します

于 2013-02-16T16:03:37.313 に答える