web-dev-qa-db-ja.com

make_sharedと同等のもので配列を割り当てることができますか?

_buffer = new char[64];
buffer = std::make_shared<char>(char[64]); ???
_

make_shared<>()を使用して配列にメモリを割り当てることはできますか?

私にできること:buffer = std::make_shared<char>( new char[64] );

しかし、それでも新しいものを呼び出す必要があります。私の理解では、_make_shared_の方が安全で効率的です。

26
Josh Elias

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[]を提供しないため、new []から取得するポインタと同じ方法で共有ポインタを使用することはできないことに注意してください。 。逆参照する必要があります:(*buffer)[n] = 'a';

22
Cubbi

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

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

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

auto buffer = std::make_shared<char[]>(64);
9
Myon

これはどう?

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);
2
ToyAuthor X