关于 Scot Meyers 的《Effective Modern C++》一书,以及第 21 条:“Prefer std::make_unique and std::make_shared to direct use of new”:
“某些类定义了自己的 operatornew
和 operator版本delete
。通常,特定于类的例程仅设计为分配和释放与类对象大小精确匹配的内存块。这样的例程不适合std::shared_ptr
's 对自定义的支持分配(通过std::allocate_shared
)和释放(通过自定义删除器),因为std::allocate_shared
请求的内存量不是动态分配对象的大小,而是该对象的大小加上控制块的大小。因此,使用 make 函数使用特定于类的 operatornew
和 operator版本创建类型的对象delete
通常是一个糟糕的主意。”
如果自定义和在与标准和相同的地方被调用,为什么这是allocate_shared
/的问题?make_shared
new
delete
new
delete
构造:操作符new
只是用来构造资源对象,而make_shared
/allocate_shared
构造了控制块。
销毁:指定或不指定自定义删除器函数,当delete
被调用时,只应删除资源对象。控制块取决于引用和弱计数。
为什么然后这句话:“这样的例程不适合std::shared_ptr
支持自定义分配(通过std::allocate_shared
)和释放(通过自定义删除器),因为std::allocate_shared
请求的内存量不是动态分配对象的大小,而是该对象的大小加上控制块的大小。”?