2013-03-11 29 views
12

ich eine Klasse A haben, die ein Feld vom Typ hat std::unique_ptr:verschieben Besitz von std :: shared_ptr std :: unique_ptr

class A 
{ 
public: 
    std::unique_ptr pointer; 
// class body 
}; 

Und irgendwo im Code, ich verwende einige std::shared_ptr s, die auf das gleiche Objekt. Nun, was ich erreichen möchte, ist, das Eigentum auf diese std::unique_ptr in meiner Klasse zu verschieben, so dass, wenn alle shared_ptr s zerstört werden, mein Objekt am Leben bleibt, solange diese unique_ptr am Leben bleiben wird.

Meine Frage ist - ist es möglich, den Besitz von std::shared_ptr zu std::unique_ptr zu verschieben und wenn ja, wie kann ich das tun?

+8

Logischerweise macht ein solches Szenario keinen Sinn für mich. Nehmen wir einmal an, dass es möglich ist, das Onwership zu übertragen, aber Sie könnten das * nur tun, wenn Sie sicher sind, dass es nur ein einziges gibt: 'shared_ptr' alives; Wenn das der Fall ist, können Sie 'shared_ptr' noch als Mitglied von' A' verwenden und ** so tun, als wäre es 'unique_ptr'. – Nawaz

+1

"verschiebe den Besitz auf diesen std :: unique_ptr in meiner Klasse, so dass, wenn alle shared_ptrs zerstört werden, mein Objekt solange am Leben bleibt, wie dieser unique_ptr am Leben bleibt ..." Warum nicht einfach einen weiteren in A teilen? – qPCR4vir

+1

Was ist, wenn N andere geteilte Zeiger auf dasselbe Objekt zeigen? Wie konntest du das vielleicht handhaben? 'shared_ptr' bietet aus irgendeinem Grund keine' release' Methode. –

Antwort

14

Logischerweise macht ein solches Szenario keinen Sinn für mich.

Angenommen, für eine Weile, dass es möglich ist, das Eigentum zu übertragen, aber man konnte die nur, wenn Sie sicher sind, dass es nur einshared_ptr alives ist; Wenn dies der Fall ist, können Sie immer noch shared_ptr als Mitglied von A und so tun, als ob, dass es unique_ptr ist.

Und dann kommentiert Sie:

Das stimmt, ich shared_ptr in der A-Klasse schaffen könnte. Ich glaube, ich habe ein Konzept noch einmal falsch verstanden. Ich wollte es so verhalten: Wenn unique_ptr stirbt, stirbt auch das Objekt selbst, obwohl shared_ptr immer noch darauf zeigen, aber das ist albern, da sie nicht wissen würden, dass das Objekt selbst zerstört wurde und sie deshalb nicht nullptr wären s.

In diesem Fall sehen Sie sich den falschen Smart Pointer an. Was Sie wahrscheinlich brauchen, heißt std::weak_ptr. Wenn ja, stellen Sie sicher, dass Sie eine std::shared_ptr und alle anderen als std::weak_ptr verwenden.

+3

Nun, in der Tat kam das Szenario gerade rechtmäßig für mich auf, da mein Code 'unique_ptr' verwendet (aus guten Gründen), aber ich muss Daten von einer lib holen, die nicht kopierbare Typen nicht verarbeiten kann. Sicher, ich werde die Lib reparieren wollen, aber Upstream & Deployment wird Zeit brauchen, also da haben Sie es. –

Verwandte Themen