gpt4 book ai didi

c++ - 使用智能指针包装 C 创建和销毁函数

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:03:45 27 4
gpt4 key购买 nike

我有一些处理对象创建和销毁的 C API,它提供了:createObject(...)destroy(...)。我想把它包装成一些更现代的构造/销毁机制,并将它们与智能指针一起使用。我担心在某个时候我会忘记销毁对象,或者会发生一些异常。

我知道 shared_ptr 的自定义删除函数,但我不能显式调用 new,因为 createOjbect 函数处理初始化。

我可以在这种情况下使用 STL 智能指针吗?在这种情况下,我是否必须从头开始实现一个在构造函数中初始化、在析构函数中析构和引用计数的类?

最佳答案

std::shared_ptr完全有能力使用 cutstom creator 和 deleter 创建和删除对象,而不是 new你必须使用创建者功能。

让我们考虑一下,我们有以下创建者和删除者:

typedef struct {
int m_int;
double m_double;
} Foo;

Foo* createObject(int i_val, double d_val) {
Foo* output = (Foo*)malloc(sizeof(Foo));

output->m_int = i_val;
output->m_double = d_val;

puts("Foo created.");
return output;
}

void destroy(Foo* obj) {
free(obj);
puts("Foo destroyed.");
}

要管理由上述函数创建的 Foo 实例,只需执行以下操作:

std::shared_ptr<Foo> foo(createObject(32, 3.14), destroy);

使用 std::shared_ptr如果您不想共享对象的所有权,这是一项开销。在这种情况下 std::unique_ptr好多了,但是对于这种类型,您必须定义一个自定义删除仿函数,它可以使用它删除托管的 Foo 实例:

struct FooDeleter {
void operator()(Foo* p) const {
destroy(p);
}
};
using FooWrapper = std::unique_ptr<Foo, FooDeleter>;

/* ... */

FooWrapper foo(createObject(32, 3.14));

关于c++ - 使用智能指针包装 C 创建和销毁函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45893205/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com