关于这本书" Effective Modern C ++"来自Scot Meyers和第21项:"首选std :: make_unique和std :: make_shared直接使用new":
"某些类定义了自己的运算符new
和运算符delete
的版本。通常,特定于类的例程被设计为仅分配和释放具有类的对象大小的内存块。这样的例程不适合std::shared_ptr
支持自定义分配(通过std::allocate_shared
)和解除分配(通过自定义删除器),因为std::allocate_shared
请求的内存量不是动态分配对象的大小,它是该对象的大小加上控制块的大小。因此,使用make函数创建具有类特定版本的运算符new
和运算符delete
的类型对象通常是一个糟糕的主意。"
如果在标准allocate_shared
和{{1}的同一位置调用自定义make_shared
和new
,为什么这是delete
/ new
的问题}}?
结构:
运算符delete
仅用于构造资源对象,但new
/ make_shared
构造了控制块。
破坏:
无论是否指定了自定义删除函数,在调用allocate_shared
时,只应删除资源对象。控制块取决于参考值和弱计数。
为什么然后句子:"这样的例程不适合delete
支持自定义分配(通过std::shared_ptr
)和解除分配(通过自定义删除器),因为std::allocate_shared
请求的内存不是动态分配对象的大小,它是该对象的大小加上控制块的大小。"?