常见的C模式,但用C++表示?

abe*_*nky 4 c c++ design-patterns protocol-buffers

C编程中的常见模式涉及可变长度结构,例如:

typedef struct {
    int length;
    char data[1];
} MyBuffer;
Run Code Online (Sandbox Code Playgroud)

其中数据不是字面上的数组[1].相反,它的可变长度由length.

结构分配如下:

MyBuffer* pBuff = malloc(sizeof(MyBuffer) + 100);
Run Code Online (Sandbox Code Playgroud)

我想使用相同的模式,但在C++代码中,所以使用new/ delete而不是malloc/free

可以在C++代码中使用相同的模式吗?怎么样?

编辑由于几个答案和评论建议我切换到std::vector:

MyBuffer从第三方C库提供了结构定义.
在我的C++应用程序中,我需要分配缓冲区并在C库中调用一个函数.

在边界的"我的一边",我更喜欢保留C++,并以C++方式分配这个结构,但是我仍然需要将它传递给一个不会理解像a的东西的C库std::vector.

tro*_*foe 6

如果你需要保持与你正在使用的现有C代码的兼容性,那么它适用于C++,几乎没有变化(只需要转换来自malloc()).

#include <stdlib.h>

typedef struct {
    int length;
    char data[1];
} MyBuffer;

void f() {

    MyBuffer* pBuff = (MyBuffer *)malloc(sizeof(MyBuffer) + 100);
}
Run Code Online (Sandbox Code Playgroud)

这使用g ++编译没有问题.

如果您担心管理我分配的内存,malloc()那么您可以创建一个类来管理它并MyBuffer通过成员方法公开指针,例如:

std::shared_ptr<MyBuffer> buf((MyBuffer *)malloc(sizeof(MyBuffer) + 100), free);
Run Code Online (Sandbox Code Playgroud)

哪个很麻烦,我承认......


Mar*_*k B 5

这在C++中不是惯用的,也不是必需的.该语言为您提供了std::vector<unsigned char>包装大小和缓冲区的语言,或者如果您不需要在运行时C++ 11提供的动态大小调整std::array<unsigned char>.

编辑:这里要注意的关键是不要vector在堆上自行分配!如果将向量按值放在堆栈上或其他对象中并在构造中正确调整大小,则将使用与C版本(一个)完全相同的分配数量.但是你将使用惯用语言功能并防止自己制造各种各样的内存错误和/或泄漏.

  • 像许多STL解决方案一样,这个C++解决方案至少需要两倍于malloc(或类似的东西)的调用.减少这样的调用(以及指向具有指向另一个动态对象的指针的动态对象所需的指针间接性)是C语言背后的原因. (3认同)
  • @Mike Housky看我的编辑.如果你以理智的方式使用`vector`它不应该有比C版本更多的分配. (2认同)