2013-02-21 4 views
6

Hier ist meine Struktur AIn C++, wie ein Destruktor zum Freigeben von Speicher des Zeigers auf eine Struktur schreiben?

struct A { 
    int a1; 
    int a2; 
    ~A() { } 
}; 

B wird eine andere Struktur, die einen Zeiger auf eine

struct B { 
    B(int b, A* a) 
     : b1(b), ptr2A(a) 
    {} 
    int b1; 
    A* ptr2A; 

    ~B() { 
     delete b1; 
     // traverse each element pointed to by A, delete them <---- 
    } 
}; 

Später enthält auf I unten Code

int bb1; 
vector <A*> aa1; 
// do some stuff 
B *ptrB = new B(bb1, aa1); 

I/gratis alle löschen verwenden müssen der Speicher, auf den ptrB zeigt. Daher muss ich den korrekten Destruktor in Struktur B schreiben. Wie durchquere ich jedes Element, auf das A zeigt, und lösche es?

+2

Sie benötigen ein C++ Buch. Sie versuchen, Dinge aus 'C' zu mischen und zu vergleichen und automatische Variablen zu löschen. Außerdem gibt es nichts, was man in "A" durchqueren kann - man löscht einfach "ptr2A". – Yuushi

+1

Warum löschen Sie b1? – StarPinkER

+0

mögliche Duplikate von [Wie schreibe ich Destruktor, wenn ich Zeiger in der Klasse habe?] (Http://stackoverflow.com/questions/5317735/how-to-write-destructor-when-i-have-pointers-in-class) – jogojapan

Antwort

12

Wenn Sie einen C++ 11-Compiler verwenden, verwenden Sie einfach std :: shared_ptr und Sie müssen sich nicht um Löschungen kümmern. Dies liegt daran, dass shared_ptr ein "intelligenter" Zeiger ist, der automatisch löscht, auf was er zeigt.

#include <memory> 
struct B 
{ 
    int b1; 
    std::shared_ptr<A> ptr2A; 
    B(int b, std::shared_ptr<A> a):b1(b),ptr2A(a)({} 
    ~B(){} //look ma! no deletes! 
}; 

einen freigegebenen Zeiger verwenden, wenn Sie etwas zuteilen:

#include<memory> 
... 
{ 
    .... 
    std::shared_ptr<B> ptrB(new B(bb1, aa1)); 
    //Here is another, more readable way of doing the same thing: 
    //auto ptrB = std::make_shared<B>(bb1,aa1); 
    ... 
} 
//no memory leaks here, because B is automatically destroyed 

Here's more info zum Thema Smart Pointer.

Ich sollte auch erwähnen, dass wenn Sie keinen C++ 11-Compiler haben, können Sie freigegebene Zeiger von der BOOST library bekommen.

+0

Entschuldigung. Ich brauchte lange, um zu tippen. Ich habe Details zu der Frage hinzugefügt.Ich benutze den neuen Operator später – user13107

+0

Danke! Du meinst also ich muss nur ein "delete ptrB" machen und es wird alles erledigt? – user13107

+0

Solange Sie Smartpointer verwenden, müssen Sie keine Löschvorgänge durchführen. Es gibt verschiedene Arten von Smartpointern, aber beginnen Sie mit dem shared_ptr für jetzt. – Carl

4

Sie haben nur einen Zeiger auf A. Sie müssen also nur das löschen:

~B() { 
    delete ptr2A; 
} 

Hinweis, dass man nicht delete b1, da es eine einfache int! (Der Speicher durch die Variablen der Struktur, wie b1 und der Zeiger ptr2A selbst (nicht in Anspruch genommen, was er zeigt) sind zusammen mit allen Instanzen dieser Struktur automatisch zerstört.)

+0

Entschuldigung. Ich brauchte lange, um zu tippen. Ich habe Details zu der Frage hinzugefügt. Ich benutze den neuen Operator später – user13107

5

Sie müssen nur delete Objekten zugeordnet von new. In diesem Fall muss b1 nicht gelöscht werden, da es nicht dynamisch zugewiesen wurde. Wenn Sie ptr2a mit dynamischem Speicher nicht initialisiert haben, ist es darüber hinaus ein undefiniertes Verhalten.

Sie müssen sich also keine Gedanken darüber machen, die Daten A zu löschen, da sie aus dem Speicher der Instanz der Klasse gelöscht werden.

+0

Entschuldigung. Ich brauchte lange, um zu tippen. Ich habe Details zu der Frage hinzugefügt. Ich benutze den neuen Operator später. – user13107

+0

Alles, was Sie tun müssen, ist 'delete ptrB' zu verwenden, wenn Sie den Speicher, auf den es zeigt, nicht mehr verwenden. Tun Sie das nicht innerhalb der Klasse, tun Sie es innerhalb der Hauptstelle, wo Sie es definiert haben. – 0x499602D2

+0

Ah. Ich hatte den Eindruck, dass der Code 'delete ptrB' den Destruktor von B aufruft. Also müssen wir es tun (um Speicher freizugeben, auf den' 'aa1' 'zeigt) innerhalb des Destruktors von B. – user13107

Verwandte Themen