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

che voglio fare questo:perché non posso lanciare nullptr a weak_ptr <>

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

o il valore predefinito di argomento weak_ptr è nullo, come ad esempio:

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

ma , quello che mi serve è invece di farlo:

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

perché?

+0

BTW, la prossima volta, includi anche gli errori del compilatore nella tua domanda – akappa

risposta

23

Poiché un concetto weak_ptr può essere creato solo da un altro weak_ptr o shared_ptr. Non ha senso costruire da un puntatore raw, che sia nullptr o meno.

È possibile utilizzare un default costruito weak_ptr (std::weak_ptr<MyClass>()) in cui si sta tentando di utilizzare nullptr:

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' ha un tipo speciale' nullptr_t' in modo che i puntatori grezzi non possano essere convertiti implicitamente in 'nullptr_t'. Pertanto non vedo alcun motivo per vietare 'weak_ptr (nullptr)'. – magras

+0

@magras Ho scritto questa risposta anni fa, e tbh sono d'accordo con te. Fondamentalmente, ha senso che un puntatore debole debba essere associato a un parametro shared_ptr o non associato. La commissione per gli standard ha ovviamente deciso che nullptr non ha trasmesso non associati e costruiti di default. – David

-1

scopo primario di un puntatore debole è di solito per sapere se un oggetto che potrebbe essere distrutto da altro codice esiste ancora . Come può un puntatore debole costruito da un puntatore ordinario sapere se l'oggetto esiste ancora? Riesci a immaginare un modo in cui questo potrebbe funzionare?

+4

Posso immaginarlo, penso. Abbastanza facilmente. :) – Kos

+0

"L'unico scopo del puntatore debole è sapere se un oggetto che potrebbe essere distrutto da un altro codice esiste ancora" è un'affermazione un po 'confusa. Direi che questa è una funzione di weak_ptr. Lo scopo dei puntatori intelligenti è di automatizzare la gestione della memoria. Inoltre ci sono altre strutture di weak_ptr: (1) come hai detto osservando l'oggetto senza influenza sulla sua durata (2) prevenendo i cosiddetti "cicli di conservazione" (quando c'è una cerchia di oggetti che si riferiscono reciprocamente con un puntatore condiviso oggetti vivi e che causano perdite di memoria) (3) può riferirsi all'oggetto puntato che restituisce shared_ptr. –

+1

Che dire di quando volete che il weak_ptr sia auto-costruito in nullptr nel costruttore? Questo è quando ho bisogno di questa funzionalità. – Andrew

Problemi correlati