2017-07-08 2 views
4

Ist es möglich, make_shared zu verwenden und ein benutzerdefinierten deleter für einen Array, dass ein shared_ptr <> auf (unten ist die Art, wie ich versuchte, es über den Konstruktor zu tun, aber ich habe keine Ahnung, wie das mit make_shared funktionieren würde?shared_ptr <> auf einen Array individuellen deleter (mit make_shared)

int n = 5; 
shared_ptr<int> a(new int[n], default_delete<int[]>()); 

Was Ich mag würde, um es so aussehen zu lassen, ist so etwas wie diese, aber mit Speicher für eine int-Array Aufteilung und auch eine benutzerdefinierte deleter mit. Ist das möglich?

int n = 5; 
shared_ptr<int> a; 
a = make_shared<int>(); 
+0

Mögliche Duplikat [shared \ _ptr auf ein Array: es verwendet werden soll] (https: // stackoverflow.com/questions/13061979/shared-ptr-to-an-array-should-it-be-used) – Sneftel

+1

@Sneftel Während die Frage dort ähnlich ist, entspricht die, die Sie verknüpften, nicht mit make_shared, was das Problem ist Ich gehe dort hin. – Arman

Antwort

5

Leider gibt es keine Möglichkeit, eine benutzerdefinierte deleter von Rechts wegen jetzt angeben, mit std::make_shared, könnten Sie jedoch um make_shared einen Wrapper machen, wenn Sie

(a little less efficient wollen, aber ¯ \ _ (ツ) _/¯)

template <typename Type, typename Deleter, typename... Args> 
auto make_shared_deleter(Deleter&& deleter, Args&&... args) { 
    auto u_ptr = std::make_unique<Type>(std::forward<Args>(args)...); 
    auto with_deleter = std::shared_ptr<Type>{ 
     u_ptr.release(), std::forward<Deleter>(deleter)}; 
    return with_deleter; 
} 

Und es dann wie verwenden, so

int main() { 
    auto ptr = make_shared_deleter<int>(std::default_delete<int>(), 1); 
    cout << *ptr << endl; 
} 

Wenn Sie nur eine shared_ptr verwenden und es auf ein Array verweisen haben, siehe shared_ptr to an array : should it be used? für mehr

+1

Ah, ich verstehe. Das hilft ein bisschen. Danke für Ihre Antwort. – Arman

+1

Ich meine, Sie * nicht * wirklich * brauchen 'with_deleter' :) – Rakete1111

+0

Aber ein großer Teil der Verwendung von' std :: make_shared' ist die Reduzierung der Zuweisungen, dies adressiert das nicht –

Verwandte Themen