buffer = new char[64];
buffer = std::make_shared<char>(char[64]); ???
您可以使用 为数组分配内存make_shared<>()
吗?
我可以:buffer = std::make_shared<char>( new char[64] );
但这仍然涉及调用 new,据我了解,它make_shared
更安全、更有效。
buffer = new char[64];
buffer = std::make_shared<char>(char[64]); ???
您可以使用 为数组分配内存make_shared<>()
吗?
我可以:buffer = std::make_shared<char>( new char[64] );
但这仍然涉及调用 new,据我了解,它make_shared
更安全、更有效。
make_shared 的要点是将托管对象合并到共享指针的控制块中,
由于您正在处理 C++11,也许使用 C++11 数组可以满足您的目标?
#include <memory>
#include <array>
int main()
{
auto buffer = std::make_shared<std::array<char, 64>>();
}
请注意,您不能以与从 new[] 获得的指针相同的方式使用共享指针,因为std::shared_ptr
(std::unique_ptr
例如,与 不同)不提供operator[]
. 你必须取消引用它:(*buffer)[n] = 'a';
您需要共享分配的内存吗?您可以使用 astd::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);
这个怎么样?
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);
最有效的方法是使用make_shared()
下面的重载,它在 Boost 和 C++20 中可用。
template< class T >
shared_ptr<T> make_shared( std::size_t N );