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

标签 c++ c design-patterns protocol-buffers

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/

相关文章:

c++ - 执行程序时调用任何 cURL 函数都会导致 "entry point not found"

c - for() 循环中的 fork()

当程序在不同的地方遇到错误并退出时,C 如何释放 malloc 的内存?

java - 对象层次结构的工厂(多态静态方法解决方法)

design-patterns - 构建器模式的 clojure 方式是什么?

c# - 业务逻辑层应该访问数据库/数据访问层吗?

c++ - Winsock2 C++ : How do I find the address for an IPv4 client to send a packet to an IPv6 server?

c++ - ORPG引擎开发,构建代码(C++,2D)

c++ - Gtk::Window set_visible 导致空白窗口

与 Terry Guo 的 gcc-arm-none-eabi 交叉编译