2012-03-31 12 views
1

In C++, wessen Verantwortung ist es, Mitglieder einer Klasse zu löschen: die Klasse oder der Ersteller einer Instanz dieser Klasse?
Zum Beispiel in dem folgenden Code:Wessen Verantwortung ist es zu löschen

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

Sollte main löschen die Instanz von B oder dessen lokale Variable objA ‚s destructor löschen? Ist das in den meisten Fällen der Fall und in welchen Fällen ist dies der Fall?

+2

Dies ist, was ein Destruktor ist. Also, um die Frage zu beantworten, die Klasse, wenn der Destruktor aufgerufen wird. Wenn Sie intelligente Zeiger verwenden, müssen sich beide nicht darum sorgen. – chris

+1

Das wäre Ihre Design-Wahl. Die einzige erzwungene Regel ist folgende: Ihr Programm muss 'löschen' für jedes' neue' aufrufen. –

Antwort

3

Dies ist eine grundlegende Frage des Eigentums. Wenn jeder A eine B besitzen sollte (wie in, es sollte eine neue B erstellt werden, wenn die A erstellt wird, sollte auch zerstört werden, die A wird zerstört, dann würden Sie normalerweise A verantwortlich für die Erstellung und die Zerstörung der Instanz machen 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; } 
}; 

In einem solchen Fall jedoch sind die Chancen ziemlich gut, dass A sollte wie geschrieben werden:

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

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

diese Weise wird die Instanz von B wird automatisch erzeugt und zerstört werden, ohne jegliche Intervention von Ihrer Seite.

+0

Vergessen Sie nicht die Regel der Drei. – chris

+0

@chris: ja - ein Teil des Grundes dafür, es einfach richtig zu machen und eine Instanz von B direkt in A zu aggregieren und damit fertig zu werden. –

+0

Ich sollte auch darauf hinweisen, dass das Eigentum bei Bedarf übertragen werden kann. Am Ende des Tages liegt es an Ihnen als Programmierer, zu entscheiden, wem was gehört, ob dieses Eigentum für das Leben ist oder ob dieses Eigentum je nach Anwendungsstatus übertragen wird. –

1

Fast immer A sollte seine Mitglieder verwalten, da das ist, was RAII basiert. Verwenden Sie unique_ptr, wenn Sie können.

Wenn es seine Daten nicht verwaltet, sollte es einen anderen intelligenten Zeiger verwenden, speziell shared_ptr. Dies verschiebt die Verantwortung auf die shared_ptr, die viel weniger fehleranfällig als ein Vanilla-Zeiger ist.

Und natürlich ist der bevorzugte Weg, überhaupt keine Zeiger zu verwenden. Warum rufen Sie an erster Stelle new?

+1

Warum rufe ich neu an: um diese Frage zu stellen. Ich komme von Java und C nach C++, und ich möchte alles verstehen. Ich habe noch nie von intelligenten Zeigern oder RAII gehört, aber ich werde sie nachschlagen. Vielen Dank! – Robz

+0

@Robz - In C++ nennt man kaum "neu". C++ und Java sind * sehr * verschiedene Sprachen. –

+0

@BoPersson, was schreibst du in C++, dass du fast nie neu nennst? :) –

Verwandte Themen