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

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

私はそれをできた:buffer = std::make_shared<char>( new char[64] );

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

4

4 に答える 4

27

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

于 2012-12-10T03:16:30.043 に答える
27

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

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

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

auto buffer = std::make_shared<char[]>(64);
于 2017-11-09T12:45:47.213 に答える
5

これはどう?

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);
于 2016-05-26T03:08:03.970 に答える
0

最も効率的な方法はmake_shared()、BoostおよびC++20で使用可能な以下のオーバーロードを使用することです。

template< class T >
shared_ptr<T> make_shared( std::size_t N );
于 2022-01-10T19:21:26.883 に答える