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

有点类似于智能指针了。

 

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

 

//用来删除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);

 

该代码已用在实际的项目中了,是没有什么问题的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值