我有一个结构
typedef struct myStruct_st
{
int a;
}myStruct;
可以使用
创建myStruct * myStruct_new()
{
printf("Allocate\n");
return new myStruct;
}
并使用
删除static void myStruct_free(myStruct * ptr)
{
printf("Deallocate\n");
delete ptr;
}
我希望为结构分配的内存自动释放
为此,我写了一个模板
template <class T>
class scoped_del
{
public:
scoped_del(T * p, void (*mfree)(T *)) :
p_(p),
mfree_(mfree)
{
}
~scoped_del()
{
mfree_(p_);
}
private:
T * p_;
void (*mfree_)(T *);
};
并像那样使用
int main()
{
myStruct * st = myStruct_new();
class scoped_del<myStruct> ptr_st(st, myStruct_free);
return 0;
}
如何使用stl或boost更加标准化?
答案 0 :(得分:3)
Boost的shared_ptr在几乎相同的代码中完全相同。
#include <boost/shared_ptr.hpp>
main() {
boost::sshared_ptr<myStruct> ptr_st(myStruct_new(), myStruct_free);
ptr_st->a = 11;
}
但您应该考虑是否要编写C ++代码或C代码。您在声明前使用了一些非常C风格的语法(typdef struct
,class
,使用“新函数”而不是构造函数,使用“自由函数”而不是析构函数),但是你标记了这个C ++,显然你正在使用一些C ++特性。如果您想使用C ++,请使用它的所有功能,如果您不想这样做,那么请坚持使用C.将两者混合太多会对任何试图找出代码的人造成很大的混淆(和你的“设计决定”)。
答案 1 :(得分:1)
我知道这是一个老帖子,但我刚发现它,我认为其他人也可能。我也在寻找一个auto_ptr
样式的智能指针,但它带有一个删除对象,出于与OP相同的原因,我也使用openssl库并想要包装资源。我正在使用boost::shared_ptr
和deleters()
来管理openssl对象,但我发现你必须要小心,因为有些openssl调用取决于你传递它们的指针。如果将其存储在shared_ptr
中,则可能会导致问题,因为最终会出现双删除方案。此外,在语义上我实际上并不想与任何人“共享”此对象的所有权。我的用法是“我拥有它”或“我想把它交给别人”。
新的C ++ 0x unique_ptr<>
可能会提供一个解决方案,但同时使用shared_ptr
小心地使用openssl对象,它可能会让你感到厌烦。