The std::shared_ptr
is fully capable to create and delete an object with cutstom creator and deleter, but instead of new
you have to use the creator function.
Let's consider, we have the following creator and deleter:
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.");
}
To manage an instance of Foo
created by functions above, simply do the following:
std::shared_ptr<Foo> foo(createObject(32, 3.14), destroy);
Using the std::shared_ptr
is an overhead if you don't wish to share the object's ownership. In this case the std::unique_ptr
is much better but for this type you have to define a custom deleter functor with which it can delete the managed Foo
instance:
struct FooDeleter {
void operator()(Foo* p) const {
destroy(p);
}
};
using FooWrapper = std::unique_ptr<Foo, FooDeleter>;
/* ... */
FooWrapper foo(createObject(32, 3.14));
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…