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.
如果你需要保持与你正在使用的现有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)
哪个很麻烦,我承认......
这在C++中不是惯用的,也不是必需的.该语言为您提供了std::vector<unsigned char>包装大小和缓冲区的语言,或者如果您不需要在运行时C++ 11提供的动态大小调整std::array<unsigned char>.
编辑:这里要注意的关键是不要vector在堆上自行分配!如果将向量按值放在堆栈上或其他对象中并在构造中正确调整大小,则将使用与C版本(一个)完全相同的分配数量.但是你将使用惯用语言功能并防止自己制造各种各样的内存错误和/或泄漏.