Object* obj; // standard pointer, should be deleted after use gml::Ref<Object> obj; // smart pointer frees memory when necessary
gml::Ref<Object> obj = new Object(1,2,3);
Smart pointers must never be defined like this: gml::Rev<Object>* obj; !!! 2) use of smart pointers Smart pointers are dereferenced like normal pointers:
gml::Ref<Object> obj = new Object(1,2,3); obj->SomeMethod(); (*obj).SomeMethod();
gml::Ref<Object> obj = new Object(1,2,3); Object* obj1 = obj;
... Object* SomeMethod(Object* obj); ... gml::Ref<Object> obj = new Object(1,2,3); gml::Ref<Object> obj1 = SomeMethod(obj);
class SomeClass { private: Object* obj; public: void CreateObject() { gml::Ref<Object> obj = new Object(1,2,3); m_obj = obj; } // at this point obj will be deleted, and m_obj will be undefined!! };
class SomeClass { private: gml::Ref<Object> obj; public: void CreateObject() { gml::Ref<Object> obj = new Object(1,2,3); m_obj = obj; } };
#include <gmlref.h>
Public Member Functions | |
Ref (T *real_ptr=NULL) | |
Default contructor. | |
Ref (const Ref &rhs) | |
Copy constructor. | |
~Ref () | |
Destructor. | |
Ref & | operator= (const Ref &rhs) |
Overloaded operator =. | |
T * | operator-> () const |
Overloaded operator. | |
T & | operator * () const |
Overloaded operator. | |
int | IsSet () const |
Whether this pointer is not null. | |
operator T * () const | |
Implicit conversion to C pointer. | |
void | Set (T *real_ptr) |
Forced assignment of C pointer to this reference
| |
void | Clear () |
Cleans this reference. | |
Related Functions | |
(Note that these are not member functions.) | |
Ref< newT > & | ConvRef (const Ref< oldT > &old_ref) |
Casting & convertion of smart references. |
Object* obj; // standard pointer, should be deleted after use gml::Ref<Object> obj; // smart pointer frees memory when necessary
gml::Ref<Object> obj = new Object(1,2,3);
Smart pointers must never be defined like this: gml::Rev<Object>* obj; !!! 2) use of smart pointers Smart pointers are dereferenced like normal pointers:
gml::Ref<Object> obj = new Object(1,2,3); obj->SomeMethod(); (*obj).SomeMethod();
gml::Ref<Object> obj = new Object(1,2,3); Object* obj1 = obj;
... Object* SomeMethod(Object* obj); ... gml::Ref<Object> obj = new Object(1,2,3); gml::Ref<Object> obj1 = SomeMethod(obj);
class SomeClass { private: Object* obj; public: void CreateObject() { gml::Ref<Object> obj = new Object(1,2,3); m_obj = obj; } // at this point obj will be deleted, and m_obj will be undefined!! };
class SomeClass { private: gml::Ref<Object> obj; public: void CreateObject() { gml::Ref<Object> obj = new Object(1,2,3); m_obj = obj; } };
gml::Ref<BaseObject> b; gml::Ref<DerivedObject> c; c = b; // this may not work in compilers which nor support template casting methods c = gml::ConvRef<DerivedObject>(b); // OK
Object* CreateObject() { gml::Ref<Object> obj = new Object; return obj; // at this point reference count of obj is 1, so the obj is deleted // before returned from the function! }
Object* CreateObject() { Object* obj = new Object; return obj; }
gml::Ref<Object> CreateObject() { gml::Ref<Object> obj = new Object; return obj; }
gml::Ref<Object> obj = new Object[10]; // result is undefined!!!!!
All smart object should be create by new operator! The following is strictly forbidden :
Object obj; gml::Ref<Object> = &obj;