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
更安全,更高效。
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
更安全,更高效。
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';
爲什麼,是的。我從來沒有停止學習新的C++ 11技巧... –
雖然我不能在編譯時指定數組的大小嗎? –
@JoshElias你當然可以在編譯時。你的意思是運行時?這將需要您自己的類,它將數組大小作爲構造函數參數,因爲'make_shared
這個怎麼樣?
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);
創建新的'shared_ptr'和使用'make_shared'有一個區別,後者的原子操作少一個,只要有可能,它就是首選。 – SagiLow
你需要分配的內存共享?您可以使用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);
'的std ::矢量緩衝液( 64);' –