6

次の問題があります。myClassで、デフォルトでyourClassへのポインタを新しいyourClassアドレスで初期化します。残念ながら、任意の時点でポインタを削除したい場合は、(コアダンプ)を取得します。

class myClass
{
      protected:
      yourClass * yc;

      public:
      myClass() { yc = new yourClass(); }

      myClass(yourClass * tyc ) { delete yc; yc = tyc; }

      ~myClass() { delete yc; yc = NULL; }

      void setMyClass (yourClass * tyc) { delete yc; yc = tyc; }

      void print () { yc->print(); }
};

int main()
{
  yourClass b (//parameter);
  myClass * a = new myClass();
  a->print();
  a->setMyClass(&b)
  a->print();

  delete a;
  return 0;
}

aのprint()は、//パラメータに応じて2つの異なる出力になります。

yourClassycを検討しました。yourClass * ycの代わりに、それが可能かどうか知りたいです。

編集: 私は次の方法でコードを作り直しました、そしてそれは働きます。まだ複雑に見えますが、スマートポインターは有望であるように思われ、私はまだ「三つのルール」を適用しませんでした。ここにコードがあります。皆さんありがとう。

class myClass
{
      protected:
      yourClass * yc;
      bool dynamic;

      public:
        myClass() { dynamic = true; yc = new yourClass (); }
        myClass (yourClass * tyc ) 
        { 
          // dynamic init (like default)
          if (tyc == NULL ) { dynamic = true; yc = new yourClass (); }
          // static use of yc
          else { dynamic = false; yc = tyc; } 
        }
        // because only if dynamic is true, we need to erase
        ~blu () { if (dynamic) { delete yc; dynamic = false; } } 

        void setMyClass(yourClass* tyc) 
        { 
          // leaving unchanged if new-stuff is NULL or like old-stuff
          if ( tyc == yc || tyc == NULL ) return;
          else // treating dynamic and static differently
          { 
            if (dynamic) // if flag is set, must be deleted 
            {
              delete yc; yc = tyc; dynamic = false;
            }
            else // must not be deleted, dynamic is still false
            {
              yc = tyc;
            }
          }
        }
        void print () { yc->print(); }
};
4

2 に答える 2

7

これは、削除しようとしていることが多すぎるためです。

  • 2番目のコンストラクターで割り当てられていないオブジェクトを削除します(remove delete yc;
  • スタックに割り当てられたオブジェクトを削除しようとしています。b。delete a;スタック上のオブジェクトであるbへのポインタを削除しようとします。何が起こるかはあなたのOSに依存します(私は例外/コアダンプ/何でも期待します)

編集:私が見つけた別の問題.. a->setMyClass(NULL)

私は提案します:

  • スマートポインタに関するこの投稿
  • RAIIに関するこのブログ投稿
  • スタックとヒープの割り当て(静的と動的?)を説明するC /C++入門書
于 2013-02-01T13:02:14.757 に答える
1

あなたは三つのルールに違反しています。

三つのルールとは何ですか?

また、これは災害のレシピです:

 myClass(yourClass * tyc ) { delete yc; yc = tyc; }

どうなりtyc==ycますか?右。きれいではない:)

 myClass(yourClass * tyc ) { if (yc!=tyc) { delete yc; yc = tyc; } }
于 2013-02-01T13:06:34.940 に答える