2012-07-01 8 views
12
class MyClass { 
public: 
    MyClass(std::weak_ptr<MyClass> parent){} 
} 

weak_ptr nicht werfen nullptr dies tun:warum kann ich ich will <>

auto newInstance = std::make_shared<MyClass>(nullptr); 

oder Standardwert von weak_ptr Argument null ist, wie zum Beispiel:

void function(int arg,std::weak_ptr<MyClass> obj = nullptr); 

aber , was ich brauche, ist, dies stattdessen zu tun:

warum ist das?

+0

BTW, ist beim nächsten Mal, auch den Compiler-Fehler in Ihrer Frage – akappa

Antwort

23

Da ein weak_ptr im Konzept kann nur aus einem anderen weak_ptr oder shared_ptr konstruiert werden. Es macht einfach keinen Sinn, aus einem rohen Zeiger zu konstruieren, ob es nullptr ist oder nicht.

Sie ein Standard-weak_ptr konstruiert verwenden (std::weak_ptr<MyClass>()), wo Sie verwenden nullptr versuchen:

auto newInstance = std::make_shared<MyClass>(std::weak_ptr<MyClass>()); 
void function(int arg,std::weak_ptr<MyClass> obj = std::weak_ptr<MyClass>()); 
+1

'nullptr' spezielle Art' hat nullptr_t' so roh Zeiger nicht implizit auf 'nullptr_t' umgewandelt werden kann. Daher sehe ich keine Gründe, um 'weak_ptr (nullptr)' zu verbieten. – magras

+0

@magras Ich habe diese Antwort vor Jahren geschrieben, und tbh ich stimme dir irgendwie zu. Grundsätzlich ist es sinnvoll, dass ein schwacher Zeiger entweder einem shared_ptr zugeordnet oder nicht zugeordnet werden muss. Der Normenausschuss hat offensichtlich entschieden, dass nullptr nicht unassociated sowie default constructed vermittelt. – David

-1

ein schwacher Hauptzweck des Zeigers ist in der Regel zu wissen, ob ein Objekt, das noch von anderem Code zerstört werden könnte, existiert . Wie könnte ein schwacher Zeiger, der aus einem gewöhnlichen Zeiger konstruiert wurde, möglicherweise wissen, ob das Objekt noch existiert? Kannst du dir überhaupt vorstellen, dass das funktionieren könnte?

+4

Das kann ich mir vorstellen, denke ich. Ziemlich einfach. :) – Kos

+0

"Der einzige Zweck eines schwachen Zeigers ist es, zu wissen, ob ein Objekt, das durch anderen Code zerstört werden könnte, noch existiert" ist eine etwas verwirrende Aussage. Ich würde sagen, das ist die Fähigkeit von weak_ptr. Der Zweck von Smartpointern ist es, die Speicherverwaltung zu automatisieren. Darüber hinaus gibt es einige weitere Möglichkeiten von weak_ptr: (1) wie du gesagt hast, beobachtendes Objekt ohne Einfluss auf seine Lebenszeit (2) verhindere sogenannte "Retain-Zyklen" (wenn sich ein Kreis von Objekten mit geteilten Zeigern referenziert und somit alle hält Objekte lebendig und verursacht Speicherlecks) (3) kann auf spitzes Objekt zurückgeben shared_ptr verweisen. –

+1

Wie wäre es, wenn Sie wollen, dass der weak_ptr im Konstruktor automatisch zu nullptr konstruiert wird? Das ist, wenn ich diese Funktionalität brauche. – Andrew

Verwandte Themen