您的位置:首页 > 数据库 > MySQL

一个简单的类,来管理mysql的结果集的指针。

2010-12-02 16:16 453 查看
有点类似于智能指针了。

当然,这是一个模板类,你可以用于任何你想要管理的指针。

//用来删除mysql结果集的函数对象

struct Mysql_Result_Deleter

{

void operator()(MYSQL_RES* result)

{

if (result != NULL)

mysql_free_result(result);

}

};

//默认删除资源的策略,用delete

template<class _Ty>

struct my_default_delete

{ // default deleter for unique_ptr

typedef my_default_delete<_Ty> _Myt;

my_default_delete()

{ // default construct

}

template<class _Ty2>

my_default_delete(const my_default_delete<_Ty2>&)

{ // construct from another default_delete

}

void operator()(_Ty *_Ptr) const

{ // delete a pointer

if (0 < sizeof (_Ty)) // won't compile for incomplete type

delete _Ptr;

}

};

// this class is as simple as possbile to hold the stack pointers

// to make sure that the pointer will be deleted if there is any exception

//

//模板函数

template<typename T1, typename T2 = my_default_delete<T1>>

class scope_ptr_holder

{

T1* original_pointer;

T2 itsdeleter;

public:

explicit scope_ptr_holder(T1* t) // constructor

:original_pointer(t){}

explicit scope_ptr_holder(T1* t , T2 deleter) // constructor

:original_pointer(t),

itsdeleter(deleter){}

void Reset(T1* newptr)

{

if(newptr == original_pointer)

return;

if (original_pointer != NULL)

itsdeleter(original_pointer);

original_pointer = newptr;

}

~scope_ptr_holder()

{

if (original_pointer != NULL)

{

itsdeleter(original_pointer);

original_pointer = NULL;

}

}

protected:

scope_ptr_holder(const scope_ptr_holder&);

const scope_ptr_holder& operator=(const scope_ptr_holder&);

};

}

实例代码:

sqlstream << "select * from pagecontainequipment where pageid = " << page->GetID() << endl;

string sql = sqlstream.str();

MYSQL_RES* result = QueryAndReturnResult(sql.c_str());

if (result == NULL)

return false;

scope_ptr_holder<MYSQL_RES, Mysql_Result_Deleter> resultholder(result);

该代码已用在实际的项目中了,是没有什么问题的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: