源码

将C接口写入动态分配的C结构


简介:我正在编写一个C 11应用程序,它广泛使用了传统的C代码库.遗留代码中一个非常常见的模式是存在一些结构LegacyStruct,它由诸如的方法构造和销毁

build_struct(LegacyStruct *L, int arg1, int arg2)
free_struct(LegacyStruct *L)

它们基本上是构造函数/析构函数.遗留代码库中的所有权模型非常unique_ptr-esque,因此我的目标是将其包装在内存安全,具有RAII意识的包装类中,如下所示:

class Wrapper {
public:
    Wrapper::Wraper() : handle() {}
    Wrapper::Wrapper(int same_arg1, int same_arg2);
    Wrapper::Wrapper(const Wrapper &W) = delete;
    Wrapper::Wrapper(Wrapper &&W) : handle(std::move(W.handle)) {}
    //copy operator= and move operator= analogously
private:
    std::unique_ptr handle;

其中custom_deleter沿this question行调用free_struct,或者只调用LegacyStruct的std :: default_delete的部分特化.无论如何到目前为止这么好,我认为这是一种常见的设计模式,它很适合我的需求.

我的问题:我无法将此模式应用于我处理表单的链表类型结构的情况

typedef struct LegacyNode {
    int stack_allocated_data;
    OtherStruct *heap_allocated_data;
    LegacyNode *next;
} LegacyNode;

同样,遗留代码库中的所有权模型是unique_ptr-esque:链接列表的唯一所有权,即负责适当地释放它.类似地,有一个相应的free_node(LegacyNode * N)函数,如果需要,它可以释放heap_allocated_data,然后释放节点本身.

但建筑情况却截然不同.会有一个看起来像的功能

build_list(LegacyNode **L, int *count_p, int other_args){
    LegacyNode *newnode;

    //code allocating newnode and populating its fields

    //...and then:
    newcut->next = *L;
    *L = newcut;
    (*count_p)++;
}

对build_list的调用看起来像

int list_count = 0;
LegacyNode *L = (LegacyNode *) NULL;

build_list(&L, &list_count, 99);

编辑/澄清:build_list是代码库中的一个静态的非导出函数,我可以通过调用一些其他函数来访问它,这些函数可能会多次调用build_list.

因此,我想编写一个存储头节点和列表长度的ListWrap类,并且具有与上面的Wrapper相同的复制/移动操作符,即,对列表本身有唯一的所有权,它可以移动但不能复制,等等

但是,我的理解是智能指针在这种情况下不是一个选项.使用head_node作为LegacyNode的智能指针,我必须将& head_node.get()传递给build_list,这会破坏智能指针不变量/所有权?

就目前而言,我的包装类包含一个指向头节点的原始指针,一个返回头节点地址以供build_list使用的方法,一个遍历调用free_node的列表的析构函数,以及基于谓词的erase-type方法.只删除某些元素.

当然,修改和清除链接列表是CS-101级别的东西,但我仍然浪费了几个小时来编写它并且在整个地方都有内存泄漏!此外,遗留代码库中还有几个其他链接列表结构,几乎完全相同,因此我希望能够将其转换为可以专门用于类型和删除的类模板,并继承自提供类型 – 具体方法.

谢谢

(2)

本文由 投稿者 创作,文章地址:https://blog.isoyu.com/archives/jiangcjiekouxierudongtaifenpeidecjiegou.html
采用知识共享署名4.0 国际许可协议进行许可。除注明转载/出处外,均为本站原创或翻译,转载前请务必署名。最后编辑时间为:11月 11, 2019 at 05:27 下午

热评文章