std::make_shared()是否使用自定义分配器
Does std::make_shared() use custom allocators?
考虑以下代码:
#include <memory>
#include <iostream>
class SomeClass {
public:
SomeClass() {
std::cout << "SomeClass()" << std::endl;
}
~SomeClass() {
std::cout << "~SomeClass()" << std::endl;
}
void* operator new(std::size_t size) {
std::cout << "Custom new" << std::endl;
return ::operator new(size);
}
void operator delete(void* ptr, std::size_t size) {
std::cout << "Custom delete" << std::endl;
::operator delete(ptr);
}
};
int main() {
std::shared_ptr<SomeClass> ptr1(new SomeClass);
std::cout << std::endl << "Another one..." << std::endl << std::endl;
std::shared_ptr<SomeClass> ptr2(std::make_shared<SomeClass>());
std::cout << std::endl << "Done!" << std::endl << std::endl;
}
下面是它的输出:
Custom new
SomeClass()
Another one...
SomeClass()
Done!
~SomeClass()
~SomeClass()
Custom delete
显然,std::make_shared()
没有调用new
操作符——它使用了一个自定义分配器。这是std::make_shared()
的标准行为吗?
是的,这是标准行为。来自标准(§20.7.2.2.6 shared_ptr creation):
效果:为T类型的对象分配合适的内存,并通过放置new表达式
::new (pv) T(std::forward<Args>(args)...).
在该内存中构造一个对象
这允许make_shared
在一次分配中为对象和共享指针本身的数据结构("控制块")分配存储,以提高效率。
你可以使用std::allocate_shared
如果你想控制存储分配
为了进一步解释Mat的正确答案,make_shared
通常是通过分配一个包含shared_ptr
引用计数和未初始化字节缓冲区的对象来实现的:
template<typename T>
struct shared_count_inplace
{
long m_count;
long weak_count;
typename std::aligned_storage<sizeof(T)>::type m_storage;
// ...
};
这是将在堆上分配的类型,而不是您的类型,因此不会调用您的类型的new
。然后,您的类型将在位置(void*)&m_storage
使用位置new
来构造。
相关文章:
- 当有分配器意识的容器被复制/移动时,反弹分配器是否被复制/移走
- 是否可以使用分配器对象来释放另一个分配器分配的内存?
- C++17 和更新的 std::分配器是否适用于动态数量的自定义堆?
- 是否允许分配器构造和销毁成员函数从内部逻辑引发异常?
- shared_ptr的删除程序是否存储在自定义分配器分配的内存中?
- 包含字符串的结构的 Boost 进程间向量是否需要特殊的分配器?
- STD分配器是否会在堆上动态分配内存?它可以安全地删除内存吗?
- 供应商是否将 new 和 malloc 实现为小型对象分配器
- STD ::分配器是否处理C 17中的过度对准类型
- std::函数是否支持自定义分配器
- 当涉及分配器时,是否有类似于复制和交换习惯用法的东西
- 如何测试分配器是否使用std::allocate进行内存分配
- 是否可以编写一个自定义 STL 分配器,该分配器使用指向用户提供的分配函数的指针
- 是否有 BOOST 池固定大小的分配器
- 是否有自定义内存分配器设计模式不在其分配中存储元数据
- 在交换链中为每个渲染目标创建一个分配器是否有意义
- 传递给std::basic_string的分配器是否可以使其方法为虚拟的
- 'Tag' boost::p ool_分配器和 boost::fast_pool_allocator 中的模板参数是否支持控制基础池的实例?
- STL 中的自定义分配器是否仅分配实际数据
- std::vector::swap()和有状态分配器是否应使所有迭代器无效