2016-08-23 1 views
6

Betrachten Sie den folgenden Code ein:Ist get() zuverlässig, wenn ein auto_ptr nicht initialisiert ist?

std::auto_ptr<std::string> p; 

if (p.get() == 0) { 
    ... 
} 

Ist get() Memberfunktion eine Standard- und zuverlässige Art und Weise zu überprüfen, dass p nicht initialisiert wurde? Wird es immer 0 zurückgeben, unabhängig von der Plattform, dem Compiler, den Optimierungs-Flags des Compilers usw.?

+4

In diesem Beispiel ist 'auto_ptr' * nicht *" nicht initialisiert ". Der Standardkonstruktor initialisiert den Zeiger auf einen Nullzeiger. –

Antwort

1

Die get Methode der auto_ptr kehrt hat keine Voraussetzungen.

Das bedeutet, ist es immer sicher, dass die Methode aufrufen, unabhängig davon, in welchem ​​Zustand sich das auto_ptr Objekt befindet.

dieser Kontrast mit dem operator* Member-Funktion, die eine Voraussetzung für get() != 0 hat. Der C++ - Standard legt die Voraussetzungen für Elementfunktionen in einem Requires-Klausel fest. Wenn keine solche Klausel für eine Funktion vorhanden ist, ist sie immer sicher aufzurufen.

11

Es gibt nicht so etwas wie un uninitialized std::auto_ptr, die default constructor initialisiert den Zeiger auf 0:

explicit auto_ptr(X* p = 0); 

So get() wird "0" effektiv zurück auf eine Standard-std::auto_ptr aufgebaut.

3

Die Linie

std::auto_ptr<std::string> p; 

Anrufe the constructor

explicit auto_ptr (X* p=0) throw(); 

, die auf 0

Es hängt also den internen Zeiger initialisiert, was Sie unter "nicht initialisiert wurde". Der Aufruf der Standard-Ctor, wie Sie zeigte, eine get ergeben, die es zu etwas zu initialisieren sonst 0. Auch gibt, gefolgt von einem Aufruf von reset(0) wird ergeben eine get, die 0.

+0

Wenn ich mit mehreren Plattformen arbeite, kann ich mich auf den Standardkonstruktor verlassen (ohne jede Implementierung überprüfen zu müssen) oder sollte ich explizit reset (0) aufrufen, um sicher zu gehen? – Marc

+1

Nein, es ist nicht notwendig, 'Reset' explizit nach dem Standard-CTor aufzurufen. –

Verwandte Themen