opencv 智能指针 Ptr
来源:互联网 发布:cms监控软件使用说明 编辑:程序博客网 时间:2024/06/05 11:48
//////////////////// generic_type ref-counting pointer class for C/C++ objects /////////////////////////*! Smart pointer to dynamically allocated objects. This is template pointer-wrapping class that stores the associated reference counter along with the object pointer. The class is similar to std::smart_ptr<> from the recent addons to the C++ standard, but is shorter to write :) and self-contained (i.e. does add any dependency on the compiler or an external library). Basically, you can use "Ptr<MyObjectType> ptr" (or faster "const Ptr<MyObjectType>& ptr" for read-only access) everywhere instead of "MyObjectType* ptr", where MyObjectType is some C structure or a C++ class. To make it all work, you need to specialize Ptr<>::delete_obj(), like: \code template<> void Ptr<MyObjectType>::delete_obj() { call_destructor_func(obj); } \endcode \note{if MyObjectType is a C++ class with a destructor, you do not need to specialize delete_obj(), since the default implementation calls "delete obj;"} \note{Another good property of the class is that the operations on the reference counter are atomic, i.e. it is safe to use the class in multi-threaded applications}*/template<typename _Tp> class CV_EXPORTS Ptr{public: //! empty constructor Ptr(); //! take ownership of the pointer. The associated reference counter is allocated and set to 1 Ptr(_Tp* _obj); //! calls release() ~Ptr(); //! copy constructor. Copies the members and calls addref() Ptr(const Ptr& ptr); template<typename _Tp2> Ptr(const Ptr<_Tp2>& ptr); //! copy operator. Calls ptr.addref() and release() before copying the members Ptr& operator = (const Ptr& ptr); //! increments the reference counter void addref(); //! decrements the reference counter. If it reaches 0, delete_obj() is called void release(); //! deletes the object. Override if needed void delete_obj(); //! returns true iff obj==NULL bool empty() const; //! cast pointer to another type template<typename _Tp2> Ptr<_Tp2> ptr(); template<typename _Tp2> const Ptr<_Tp2> ptr() const; //! helper operators making "Ptr<T> ptr" use very similar to "T* ptr". _Tp* operator -> (); const _Tp* operator -> () const; operator _Tp* (); operator const _Tp*() const; _Tp* obj; //< the object pointer. int* refcount; //< the associated reference counter};