2009-05-20 16 views
6

मैं उत्सुक हूं क्योंकि मुझे एमएसडीएन पर इसके बारे में पता नहीं लगा सका। मैंने पाया है कि विभिन्न COM ऑब्जेक्ट्स में Release() फ़ंक्शन मौजूद है जिसे मैं स्पष्ट रूप से पॉइंटर्स को हटाने के लिए उपयोग करना चाहता हूं। लेकिन मुझे यकीन नहीं है कि यह वास्तव में क्या लौटता है?माइक्रोसॉफ्ट ऑब्जेक्ट्स, रिलीज() फ़ंक्शन रिटर्न वैल्यू?

while(pointer->Release() > 0); 

जाहिर है कि सूचक के सभी संदर्भ जारी करेंगे: मैं इसलिए कुछ की तरह, यह संदर्भ जो अभी भी वस्तु शेष के लिए मौजूद हैं की संख्या वापसी होगी सोचता था?

या क्या मैं कुछ नहीं देख रहा हूं?

* टिप्पणी मैं IDirect3DTexture9::Release() समारोह

उत्तर

10

आपका सिद्धांत की अवधारणा से इस बारे में बात कर रहा हूँ सच है। COM मेमोरी प्रबंधन संदर्भ गिनती पर आधारित है। ReleaseIUnknown इंटरफ़ेस की विधि संदर्भ गणना को कम करेगी और इसे वापस कर देगी। वह फ़ंक्शन संदर्भ जारी नहीं करेगा। यह नहीं जानता कि संदर्भ कौन रखता है। जब तक यह शून्य तक नहीं पहुंच जाता तब तक संदर्भ गणना में कमी आती है और फिर ऑब्जेक्ट को नष्ट कर दिया जाएगा। यह खतरनाक है क्योंकि अन्य अभी भी इसका संदर्भ ले सकते हैं जो ऑब्जेक्ट के विनाश के बाद अमान्य हो जाएगा।

इस प्रकार, आपको प्रत्येक AddRef के लिए केवल Release पर कॉल करना चाहिए जिसे आपने पहले बुलाया था।

11

मेहदद ने जो कहा, उसके अलावा रिलीज का वापसी मूल्य केवल डीबगिंग उद्देश्यों के लिए है। उत्पादन कोड को सिर्फ इसे अनदेखा करना चाहिए।

रिलीज तक लूपिंग() रिटर्न 0 निश्चित रूप से एक बग है - आपको उन संदर्भों को कभी भी रिलीज़ नहीं करना चाहिए जिनके आपके पास नहीं है।

6

रिलीज() ऑब्जेक्ट की वर्तमान संदर्भ गणना वापस कर देगा। लेकिन आप ऐसा नहीं करना चाहिए:

while(pointer->Release() > 0); 

इस संदर्भ गिनती शून्य बनाने के लिए और वस्तु को नष्ट कर देगा।

कॉम में एक सरल अंगूठे का नियम हर AddRef() वहाँ रिलीज() (केवल एक) इसी किया जाना चाहिए।

आम तौर पर रिलीज() कार्यान्वयन इस प्रकार दिखाई देगा:

int nCount = InterlockedDecrement(&this->m_cRef); //Decrement the ref count 
if (nCount == 0) 
{ 
    delete this; 
} 
return nCount; 
संबंधित मुद्दे