在我正在处理的库中,我需要分配最终将传递给放置的空间-new
构造任意类型的对象。这些实例将返回给调用者代码,并且需要在用户编写 delete t;
时正常运行。或者有什么unique_ptr
他们正在使用的模拟为他们做这件事。T *t = new char[sizeof(T)]
的幼稚做法至少有一些我注意到的问题:
T
用 alignas
声明说明符,那么我不能相应地手动填充缓冲区,因为结果地址不是传递给 delete
的正确地址delete t;
将是 operator delete()
之间的不匹配和 operator delete[]()
T::operator new
和 T::operator delete
(对于内存池、隔离、跟踪等),然后我们忽略调用分配器,并且在调用解除分配器时不匹配 T *t = std::allocator<T>::allocate(1)
看起来好多了,它解决了第 1 点中的对齐问题和第 2 点中的标量/数组不匹配问题。但是,根据 cppreference , 它总是调用全局 ::operator new
.因此,它仍然会在第 3 点失败。引用有错吗?我缺少的标准库中是否有一些稍微高级一点的例程可以做正确的事情?是否有一些技巧可以在没有讨厌的模板代码的情况下正确实现正确的东西来检查
T::operator new
存在吗?
最佳答案
我认为您想遵循与 new-expression 相同的规则用于确定正确的 allocation function打电话,但我不知道有什么办法可以自动产生那个电话。原则上(我认为)编写通常的模板系列来检测特定于类的重载何时存在/不存在以及 alignof(T) > __STDCPP_DEFAULT_NEW_ALIGNMENT__
的分支在原则上相当简单(我认为)但我同意这很乏味。
关于c++ - 如何分配适合容纳 T 类型对象的缓冲区(可能过度对齐,可能有 operator new 等),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61807497/