c++ - 如何分配适合容纳 T 类型对象的缓冲区(可能过度对齐,可能有 operator new 等)

标签 c++ language-lawyer

在我正在处理的库中,我需要分配最终将传递给放置的空间-new构造任意类型的对象。这些实例将返回给调用者代码,并且需要在用户编写 delete t; 时正常运行。或者有什么unique_ptr他们正在使用的模拟为他们做这件事。
T *t = new char[sizeof(T)] 的幼稚做法至少有一些我注意到的问题:

  • 如果 Talignas 声明说明符,那么我不能相应地手动填充缓冲区,因为结果地址不是传递给 delete 的正确地址
  • 表达式 delete t;将是 operator delete() 之间的不匹配和 operator delete[]()
  • 如果代码声明了自定义 T::operator newT::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/

    相关文章:

    c - C99 是否强制要求 `int64_t` 类型始终可用?

    c++ - 从字节初始化一个由 trivially_copyable 但不是 default_constructible 对象组成的数组。 [intro.object] 中的混淆

    c++ - 使用指针问题调用类函数

    c++ - cout对象的streambuf是如何初始化的?

    c++ - 如何更改 protobuf 日志记录行为(分隔符)?

    c++ - 如何创建一个 vector 来保存同一模板类的所有类型的元素

    c++ - 是否可以从 Visual Studio 调试器检测 GDI 泄漏?

    c++ - 通过交换参数顺序的函数重载

    python - 为什么 python 在元组设计中选择逗号而不是括号?

    c++ - 为什么 std::numeric_limits<seconds>::max() 返回 0?