C 缓冲疼痛

C++ Buffer pains

本文关键字:疼痛 缓冲      更新时间:2023-10-16

我需要一个存储几个字段(包括缓冲区)的类(在C 11中)。我从构造函数中的malloc()开始,在destuructor中使用free()(我一段时间没有触摸C/C ,所以这就是我所记得的)。

我记得的下一件事(由于崩溃),我需要实现复制构造函数和一个分配运算符。现在,我只为一个带有3个字段的课程(其中一个是缓冲区)的全屏代码。

一个问题。

我应该使用什么?(我对选择的数量使我眼花azz乱-std::vectorstd::arraystd::shared_ptrboost::scoped_ptr,可能是其他选择)。

我正在寻找的此缓冲区的功能是:

  • 尽可能少的内存管理
  • 摆脱这些复制构造函数和作业操作员
  • 能够用作void*的能力(我必须将其传递给接受" void*"的函数)
  • 能够随机访问/写入它(我可能需要从中获取一个随机范围并为其编写一个随机范围)
  • 将其分配在堆上(缓冲区可能很大)
  • 最好使用某些标准设施

您应该只使用std::vector<unsigned char>作为缓冲区。这已经具有所有必要的构造函数,操作员和驱动器,因此除了使用它之外,没有什么特别的。

我不是C 专家,所以我欢迎对此解决方案提出任何批评,但是明智的指针可能会起作用。

#include <iostream>
#include <memory>

void do_something(void *buffer)
{
    char* char_buffer = (char*)buffer;
    std::cout << char_buffer[0] << std::endl;
}

int main()
{
    size_t size = 10;
    // reference counted pointer to auto-delete the buffer
    std::shared_ptr<char> buffer(new char[size], std::default_delete<char[]>());
    // use the underlying pointer
    // http://stackoverflow.com/questions/27819809/why-is-there-no-operator-for-stdshared-ptr
    buffer.get()[0] = 'a';
    do_something(buffer.get());
    // buffer deallocated at the end of scope
}
  • 尽可能少的内存管理

智能指针为您照顾

  • 摆脱这些复制构造函数和作业操作员

我认为聪明的指针可以处理

  • 能够用作void*的能力(我必须将其传递给接受" void*"的函数)

使用 .get()和cast。

  • 能够随机访问/写入它(我可能需要从中获取一个随机范围并为其编写一个随机范围)

这仍然是一个指针,所以我看不出为什么它不起作用(我没有尝试过)。

  • 将其分配在堆上(缓冲区可能很大)

它在堆上

  • 最好使用某些标准设施

<memory>

另外,结帐<vector>.data()功能,该功能返回指针到向量的基础数组。

我认为您需要某种内存缓冲区。检查此简单的C 缓冲区类。由于我的公司开发环境,不使用C 11是故意的。
https://github.com/jeremyko/cumbuffer