gpt4 book ai didi

C++ 使用智能指针来改变指针值

转载 作者:IT老高 更新时间:2023-10-28 21:35:04 27 4
gpt4 key购买 nike

考虑一个定义用于创建、销毁和使用自定义结构的函数的 C 库

struct Foo;
void foo_action(Foo*);
Foo* foo_create();
void foo_free(Foo*);

目前,我在我的 C++ 项目中使用该库如下

Foo* myfoo = foo_create();
foo_action(myfoo);
foo_free(myfoo);

我了解为什么智能指针很重要,并希望迁移我的代码以使用它们。这就是代码现在的样子。

#include <memory>
#include <functional>
typedef std::unique_ptr<Foo, std::function<void(Foo*)>> FooPtr;
// ...
FooPtr myfoo2(foo_create(), foo_free);
foo_action(myfoo2.get());

它似乎有效,但 myfoo2.get() 调用似乎很笨拙。 我是否按预期使用它?

库的另一部分创建并使用某种列表结构。 api看起来像

struct Bar;
Bar* bar_append(Bar*, int);
void bar_free_recursive(Bar*);

并用作

// using NULL as current Bar* creates the initial structure
Bar* bar = bar_append(NULL, 1);
// each invocation leads to another 'head' structure
bar = bar_append(bar, 42);
bar = bar_append(bar, 123);

由于指针(指向的地址)随着每次 bar_append 调用而变化,我将如何在此处引入智能指针,以便在当前指针值上调用 bar_free_recursive指针实例何时被释放?

最佳答案

but the myfoo2.get() invocation seems hacky. Am I using it as intended?

这不是hacky,你可以按预期使用它。

我会更进一步,将整个包装在一个类中:

struct Foo;
void foo_action(Foo*);
Foo* foo_create();
void foo_free(Foo*);

class FooWrapper
{
public:
FooWrapper() : mFoo(foo_create()) {}

void action() { foo_action(mFoo.get()); }
private:
struct FooDeleter
{
void operator()(Foo* foo) const { foo_free(foo); }
};

std::unique_ptr<Foo, FooDeleter> mFoo;
};

同理:

struct Bar;
Bar* bar_append(Bar*, int);
void bar_free_recursive(Bar*);

class BarWrapper
{
public:
explicit BarWrapper(int n) : mBar(bar_append(nullptr, n)) {}

void append(int n) { mBar.reset(bar_append(mBar.release(), n)); }

private:
struct BarDeleter
{
void operator()(Bar* bar) const { bar_free_recursive(bar); }
};

std::unique_ptr<Bar, BarDeleter> mBar;
};

关于C++ 使用智能指针来改变指针值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47015478/

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