Чья ответственность это удалить - PullRequest
1 голос
/ 31 марта 2012

В C ++, кто несет ответственность за удаление членов класса: класса или создателя экземпляра этого класса?
Например, в следующем коде:

class B {
  public:
    B(int x) { num = x; }
    int num;
};

class A {
  public:
    A(B* o) { obj = o; }
    B* obj;
};

int main(void) {
  A myA(new B(3));
  return 0;
}

Должен ли main удалить экземпляр B, или деструктор A должен удалить свою локальную переменную obj? Верно ли это в большинстве случаев, и в каких случаях, если таковые имеются, это не так?

Ответы [ 2 ]

3 голосов
/ 31 марта 2012

Это основной вопрос владения.Если каждый A должен иметь B (например, при создании A должен быть создан новый B, который также должен быть уничтожен при уничтожении A, тогда вы обычносделайте A ответственным за создание и уничтожение экземпляра B:

class B { 
    int num;
public:
    B(int x) : num(x) {}
};

class A { 
    B *obj;
public:
    A(int value) : obj(new B(value)) {}
    ~A() { delete B; }
};

В этом случае, однако, весьма велики шансы, что A следует просто записать так:

class A {
    B obj;
public:
    A(int v) : obj(v) {}
};

int main() { 
    A a(3);
    return 0;
}

Таким образом, экземпляр B будет создан и уничтожен автоматически, без какого-либо вмешательства с вашей стороны.

1 голос
/ 31 марта 2012

Почти всегда A должен управлять своими членами, так как это то, на чем основан RAII.Если возможно, используйте unique_ptr.

Если он не управляет своими данными, тогда он должен использовать другой интеллектуальный указатель, в частности shared_ptr.Это переносит ответственность на shared_ptr, который гораздо менее подвержен ошибкам, чем ванильный указатель.

И, конечно, предпочтительный способ - вообще не использовать указатели.Почему вы звоните new в первую очередь?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...