2012-12-10 8 views

Antwort

19

Der Punkt make_shared ist das verwaltete Objekt in den Steuerblock des freigegebenen Zeigers,

Da Sie den Umgang mit C++ 11, vielleicht mit einem C++ 11-Array zu übernehmen würde Ihre Ziele erfüllen ?

#include <memory> 
#include <array> 
int main() 
{ 
    auto buffer = std::make_shared<std::array<char, 64>>(); 
} 

Hinweis, dass Sie keinen gemeinsamen Zeiger die gleiche Weise wie ein Zeiger, den Sie von neuen bekäme [], weil std::shared_ptr (im Gegensatz zu std::unique_ptr, zum Beispiel) können nicht operator[] bieten. Sie müssten es dereferenzieren: (*buffer)[n] = 'a';

+0

Warum, ja, würde es. Ich höre nie auf, neue C++ 11 Tricks zu lernen ... –

+0

Ich kann die Größe des Arrays jedoch nicht zur Kompilierzeit angeben? –

+2

@JoshElias Sie können sicher zur Kompilierzeit. Meinst du Laufzeit? Das würde Ihre eigene Klasse erfordern, die Array-Größe als Konstruktorargument verwendet, da 'make_shared ' seine Laufzeitargumente an den Konstruktor von 'T' weiterleitet. Oder mache einfach einen geteilten Vektor. – Cubbi

1

Wie wäre es damit?

template<typename T> 
inline std::shared_ptr<T> MakeArray(int size) 
{ 
    return std::shared_ptr<T>(new T[size], [](T *p){ delete [] p; }); 
} 

auto buffer = new char[64]; 
auto buffer = MakeArray<char>(64); 
+0

Es gibt einen Unterschied zwischen der Erstellung neuer 'shared_ptr' und der Verwendung von' make_shared', die letztere hat eine weniger atomare Operation und wird, wenn immer möglich, bevorzugt. – SagiLow

2

Benötigen Sie den zugewiesenen Speicher, der freigegeben werden soll? Sie können eine std::unique_ptr stattdessen verwenden und die std::make_unique auf C++ 14:

auto buffer = std::make_unique<char[]>(64); 

Es wird eine std::make_shared Version ++ 20 in C zur Verfügung:

auto buffer = std::make_shared<char[]>(64); 
Verwandte Themen