c++ - 如何使用 std::make_shared 创建动态大小的缓冲区

标签 c++ std

我想优化下一个方法

auto MakeBuffer(size_t size)
{
    return std::shared_ptr<uint8_t>{new uint8_t[size], std::default_delete<uint8_t[]>()};
}

如您所见,缓冲区分两个阶段创建:

  • 为缓冲区分配内存
  • shared_ptr 已创建(并为控制分配内存 引擎盖下的对象)

在一般情况下,我们可以通过使用 std::make_shared 来避免双重分配。但是我该如何为动态大小缓冲区做呢? std::allocate_shared 不是解决方案(如果我理解正确的话),因为自定义分配器旨在仅创建对象而不是控制 block

编辑。修复了缓冲区清理中的错误

最佳答案

如果可以使用boost相反:

return boost::make_shared<uint8_t[]>(size);

似乎有一个 proposal将扩展添加到标准中,但我不知道它变成了什么。也许它将成为 future 标准的一部分。 更新:它在 C++20 中。

关于c++ - 如何使用 std::make_shared 创建动态大小的缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37698377/

相关文章:

c++ - (C++ 内存管理)如果我们有一个 int x = 1234,并且 int &y = x... 那么 y 在堆栈上的地址是什么?

C++ 继承 - 如何使用指向基类对象的指针访问子方法

c++ - clang 标准库错误或 C++ 未定义行为?

C++11 线程队列

c++ - 使用 `new` 关键字后避免不断取消引用的标准方法是什么?

c++ - C++ 中的线程池是什么,它是如何实现的?

c++ - 当我对共享库使用 "stripped, with debug_info"命令时, "file"是什么意思?

c++ - 从结构创建二进制 block

c++ - 用另一个字符串替换一个字符串的一部分

c++ - std::map 和 std::vector 线程安全吗?