2012-12-10 9 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を扱っているので

std::shared_ptrstd::unique_ptrとは異なり、たとえば)operator[]を提供していないので、あなたが、あなたは[]新しいから取得したいポインタとして共有ポインタを同じように使用することはできません

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

注意。あなたは逆参照する必要があります:(*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'の使用の違いは、後で1つの原子操作が少なくなり、可能な限りいつでも優先されます。 – SagiLow

2

割り当てられたメモリを共有する必要がありますか?代わりにstd::unique_ptrとC++ 14で利用可能std::make_uniqueを使用することができます。

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

C++ 20で利用可能std::make_sharedバージョンがあります:

auto buffer = std::make_shared<char[]>(64); 
関連する問題