2017-08-17 1 views
-6

Können Sie mir sagen, ob dies in VS2015 funktioniert?Verwenden von make_shared mit char [] oder int []

shared_ptr< char> buffer(make_shared< array< char,10>>() , [] (char *p){delete[] p; }); 

oder

shared_ptr< char> buffer(make_shared< array< int,10>>() ,default_delete< int[]>()); 
+1

versuchen Sie es und sehen? Es gibt Online-Compiler, wenn Sie keine Kopie zur Hand haben ... – xaxxon

Antwort

0

Visual Studio 2015 unterstützt nicht den C++ 17-Standard. Vor C++ 17 Standard können Sie den std::shared_ptr<T[]> Zeiger nicht haben. Aber selbst in C++ 17 unterstützt die std::make_shared Funktion keine Array-Typen, so dass Sie stattdessen die boost::make_shared verwenden müssten. Eine andere Alternative ist die Verwendung des eindeutigen Zeigers in Kombination mit dem std::make_unique, der die Array-Typen unterstützt. Dies wiederum könnte nicht eine gute Idee sein, wie von Scot Meyers in seinem „Effective Moderne C++“ Buch wies darauf hin: Sie nur intellektuelles Interesse für Arrays

Die Existenz von std :: unique_ptr sollte, weil std :: array, std :: vector und std :: string sind praktisch immer bessere Datenstruktur als Raw-Arrays.

+0

Vielleicht möchten Sie sich [diese Antwort] ansehen (https://stackoverflow.com/questions/13061979/shared-ptr-to-an-array- sollte-es-benutzt/13062069 # 13062069) wie mir von @Baum mit Augen vorgeschlagen wurde. – Ron

+0

Diese Antwort verwendet explizite neue, und mein Problem ist hier, es loszuwerden. std :: shared_ptr p (neuer int [10], std :: default_delete ()); // funktioniert in VS2015 gut. Ist es möglich, das explizite neue mit make_shared loszuwerden? Vielen Dank –