Рассмотрим библиотеку C, которая определяет функции для создания, уничтожения и работы с настраиваемой структурой
struct Foo;
void foo_action(Foo*);
Foo* foo_create();
void foo_free(Foo*);
В настоящее время я использовал библиотеку в своем проекте на С++ следующим образом
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()
кажется взломанным. Использую ли я его как предназначение?
Там другая часть библиотеки, которая создает и работает с какой-то структурой списка. Апи выглядит как
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
вызывается в текущем значении указателя при освобождении экземпляра указателя?