C 编程中的一个常见模式涉及可变长度结构,例如:
typedef struct {
int length;
char data[1];
} MyBuffer;
其中 data 并非字面上的 [1] 数组。相反,它的可变长度由 length
定义。
结构分配如下:
MyBuffer* pBuff = malloc(sizeof(MyBuffer) + 100);
我想使用相同的模式,但在 C++ 代码中,所以使用 new
/delete
而不是 malloc
/free
能否在 C++ 代码中使用相同的模式?怎么办?
编辑 由于有几个答案和评论建议我切换到 std::vector
:
我从第 3 方 C 库中获得了结构定义 MyBuffer
。
在我的 C++ 应用程序中,我需要分配缓冲区并调用 C 库中的函数。
在边界的“我这边”,我更喜欢保留 C++,并以 C++ 的方式分配这个结构,
但我仍然需要将它传递给一个 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);
}
使用 g++ 编译没有问题。
如果您担心管理分配给我的内存 malloc()
那么您可以创建一个类来管理它并通过成员方法公开 MyBuffer
指针,因为示例:
std::shared_ptr<MyBuffer> buf((MyBuffer *)malloc(sizeof(MyBuffer) + 100), free);
这很麻烦,我承认...
关于c++ - 常见的 C 模式,但用 C++ 表示?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18661767/