0

次のコード スニペットを検討してください。

#include <iostream>

using namespace std;

class X {
  public:
    class Z {
      public:
        void f() {
          cout << "Z().f()" << endl;
        }
    };

    class Y {
      public:
        int A;
        Y(int x) {
          A = x;
        }

        int c() {
          return A;
        }
    };

    public:
      Z* z;

      // How to free Y instance ?
      Y* a(int x) {
        Y* y = new Y(x);
        return y;
      }

    public:
      X() {
        z = new Z();
      }

      ~X() {
        delete z;
      }
};

int main(void) {
  int a;
  X* x = new X();
  cout << "input :" << endl;
  cin >> a;
  cout << "result : " << x->a(a)->c() << endl;
  x->z->f();
  delete x;
  return 0;
}

Z オブジェクトは ~X() で簡単に解放できますが、Y オブジェクトを解放する方法に興味がありますか? メモリアドレスを保持する変数を割り当てていないためです。

ところで、このようなものの用語は何ですか? x->a(a)->c()

ありがとうございました。:)

4

2 に答える 2

4
// How to free Y instance ?
Y* a(int x) {
  Y* y = new Y(x);
  return y;
}

問題は、インスタンスの削除を担当する関数プロトタイプからは明らかではないということです。ただし、呼び出し元のみがインスタンスへのハンドルを持っているため、削除するのは呼び出し元の責任である必要があります。これは十分に文書化されている必要があります。ただし、最善のアプローチは、適切な所有権セマンティクスを持つスマートポインターを使用することです。この場合、std::unique_ptr<Y>は適切な一致のように思われ、それを使用するという単なる事実により、意図が明確になり、所有権に関する文書化の必要がなくなります。

std::unique_ptr<Y> a(int x)
{
  return std::unique_ptr<Y>( new Y(x) );
}
于 2013-03-10T21:05:25.007 に答える
1

関数からメモリを返しているので、それを削除するのは呼び出し元次第です。

X x;

Y *ptr = x.a(5);

delete ptr;

このようなことをする必要がないことを願っています。必要に応じて、shared_ptrやなどのスマート ポインターを使用することをお勧めしますunique_ptr

std::unique_ptr<Y> a(int x) {
  return std::unique_ptr<Y>(new Y(x));
}

これにより、ポインタ クラスのデストラクタがその責任を負うため、インスタンスの削除について心配する必要はありません。

于 2013-03-10T21:08:42.390 に答える