如何删除类中的实例类

时间:2013-03-10 21:00:53

标签: c++ class

请考虑以下代码段:

#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;
}

虽然可以轻松地在~X()上释放Z对象,但我很好奇如何释放Y?因为我没有指定任何变量来保存其内存地址。

顺便问一下,这样的术语是什么? X-&gt;一种(A) - &以及c()

谢谢。 :)

2 个答案:

答案 0 :(得分:4)

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

嗯,问题是函数原型不清楚谁负责删除实例。但由于只有调用者具有该实例的句柄,因此它应该是被调用的删除责任。这应该有详细记录。但最好的方法是使用具有正确所有权语义的smart pointer。在这种情况下,std::unique_ptr<Y>似乎是一个合适的匹配,仅仅使用它的事实使得意图明确,无需有关所有权的文档:

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

答案 1 :(得分:1)

您正在从函数返回内存,因此由调用者删除它:

X x;

Y *ptr = x.a(5);

delete ptr;

希望你永远不必做这样的事情。如果必须,那么建议您使用智能指针,例如shared_ptrunique_ptr

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

有了这个,你永远不必担心删除实例,因为指针类的析构函数负有这个责任。