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
更安全、更高效。
你需要共享分配的内存吗?你可以使用 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);
make_unique
也可以工作。std::shared_ptr<char[]> b; b = std::make_unique<char[]>(25);
- Thomasmake_unique
可以正常工作。但是用那种方式初始化 shared_ptr
会多消耗一次内存分配。使用 make_shared
可以避免这种情况。 - Paul Grokestd::shared_ptr<char[]> b = std::make_unique<char[]>(25);
。 - Thomasmake_shared的目的是将被管理的对象整合到shared pointer的控制块中,
如果您正在处理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';
make_shared<T>
会将其运行时参数转发到T
的构造函数中。或者只需创建一个共享的向量即可。 - Cubbimake_shared
不仅仅是为了过早优化;它还可以用于异常安全。使用 std::shared_ptr<T>(new T)
是一个警告信号,因为如果 shared_ptr
的构造函数抛出 bad_alloc
异常,它会泄漏 new T
。 - Quuxplusonefoo(sh_ptr(new T), sh_ptr(new U));
—— 在调用sh_ptr
的构造函数之间没有序列点,因此构造的有效顺序是new U
,new T
,sh_ptr(<ptr to T>)
,sh_ptr(<ptr to U>)
。如果中间两个调用中有任何一个抛出异常,则会泄漏new U
。http://herbsutter.com/gotw/_102/ - Quuxplusone这个怎么样?
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
之间存在差异,后者少了1次原子操作,尽可能使用后者。 - SagiLowmake_shared()
重载,它在Boost和C++20中都可用。template< class T >
shared_ptr<T> make_shared( std::size_t N );
std::vector<char> buffer(64);
- Jonathan Wakely