2012-12-10 61 views
20
buffer = new char[64]; 
buffer = std::make_shared<char>(char[64]); ??? 

您可以使用make_shared<>()爲陣列分配內存嗎?你能分配一個等同於make_shared的數組嗎?

我可以這樣做:buffer = std::make_shared<char>(new char[64]);

但仍然需要調用新的,這是我的理解是make_shared更安全,更高效。

+3

'的std ::矢量緩衝液( 64);' –

回答

19

make_shared的點是對管理對象納入共享指針的控制塊,

既然你要處理的C++ 11,多半是使用C++ 11陣列將滿足你的目標?

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

請注意,您不能使用共享的指針一樣指向你的新的[]得到,因爲std::shared_ptr(不像std::unique_ptr,例如)不提供operator[]。你必須解引用它:(*buffer)[n] = 'a';

+0

爲什麼,是的。我從來沒有停止學習新的C++ 11技巧... –

+0

雖然我不能在編譯時指定數組的大小嗎? –

+2

@JoshElias你當然可以在編譯時。你的意思是運行時?這將需要您自己的類,它將數組大小作爲構造函數參數,因爲'make_shared '將其運行時參數轉發給'T'的構造函數。或者只是製作一個共享矢量。 – Cubbi

1

這個怎麼樣?

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

創建新的'shared_ptr'和使用'make_shared'有一個區別,後者的原子操作少一個,只要有可能,它就是首選。 – SagiLow

2

你需要分配的內存共享?您可以使用std::unique_ptr替代和可在std::make_unique C++ 14:

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

會有在C++ 20可用std::make_shared版本:

auto buffer = std::make_shared<char[]>(64); 
相關問題