C ++ - 定义自定义new和delete运算符时的make_shared

时间:2018-03-22 08:09:26

标签: c++11 effective-c++

关于这本书" 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_sharednew,为什么这是delete / new的问题}}?

结构: 运算符delete仅用于构造资源对象,但new / make_shared构造了控制块。

破坏: 无论是否指定了自定义删除函数,在调用allocate_shared时,只应删除资源对象。控制块取决于参考值和弱计数。

为什么然后句子:"这样的例程不适合delete支持自定义分配(通过std::shared_ptr)和解除分配(通过自定义删除器),因为std::allocate_shared请求的内存不是动态分配对象的大小,它是该对象的大小加上控制块的大小。"?

0 个答案:

没有答案