4.2. Traditional Memory De-allocation SchemasDe-allocation of memory and the destruction of objects are also different in .NET, as compared with raw C++ or COM. In C++, the object destructor is called when a stack-based object goes out of scope: {//beginning of a C++ scope MyClass object; //use object; }//end of scope, C++ calls the object destructor The object destructor is also called in C++ when the delete operator is used: //in C++: MyClass* pObject = new MyClass; //using pObject, then de-allocating it delete pObject; COM uses reference counting, and it's up to the client to increment and decrement the counter associated with each object. Clients that share an object have to call AddRef( ) to increment the counter. New COM objects are created with a reference count of one. When a client is done with an object, it calls Release( ) to decrement the counter: //COM pseudo-code: IMyInterface* pObject = NULL; ::CoCreateInstance(CLSID_MyClass,IID_IMyInterface,&pObject); //using pObject, then releasing it pObject->Release( ); When the reference count reaches zero, the object destroys itself: //COM implementation of IUnknown::Release( ) ULONG MyClass::Release( ) { //m_Counter is this class counter m_Counter--; if(m_Counter == 0) { delete this; return 0; } //Should return the counter: return m_Counter; } |