मैं एक C++/CLI कार्यान्वित finalizer और नाशक के साथ नाम "CTransferManaged" वर्ग है इस्तेमाल किया नहीं कहा:सी #/CLI: नाशक अगर निपटान() में यह
CTransferManaged::~CTransferManaged()
{
this->!CTransferManaged();
}
CTransferManaged::!CTransferManaged()
{
//Clean up resources...
}
इस वर्ग के एक सी # वर्ग के साथ लिपटे है नामित "CTransfer" एक ऑब्जेक्ट m_transfer प्रकार का प्रकार CTransferManaged है।
इस वर्ग के नाशक केवल m_transfer मैं देख सकता हूँ कि नाशक कहा जाता है (ब्रेकप्वाइंट मारा जाता है) वस्तु के संदर्भ को साफ करता है, तो:
~CTransfer()
{
m_transfer = null; //breakpoint on this line
}
अगर मैं m_transfer का निपटान() फ़ंक्शन को कॉल करें किसी और चीज को बदले बिना ऑब्जेक्ट, विनाशक अब और नहीं कहा जाता है (ब्रेकपॉइंट और अधिक हिट नहीं)। कोई अनुमान क्यों?
~CTransfer()
{
m_transfer.Dispose(); //breakpoint on this line
m_transfer = null;
}
मैं निपटान() कॉल करने के लिए मैन्युअल रूप से के बाद से मुझे पता चला कि C++/CLI वस्तु (m_transfer) के संसाधनों का ठीक से साफ नहीं कर रहे हैं अगर मैं कॉल मैन्युअल फेंक नहीं है चाहते हैं। फिलहाल मुझे नहीं पता कि क्यों।
सीट्रांसफर (सी # कक्षा) के विनाशक को जितनी जल्दी कहा जाता है उतना ही नहीं कहा जाता है जितना इसे CTransferManaged :: Dispose() (C++/CLI) कहते हैं?
आपका सीट्रांसफर वर्ग * आईडीआईस्पोज़ेबल को लागू करना चाहिए ताकि यह m_transfer सदस्य को सही ढंग से निपटान कर सके। ऐसा लगता है कि आपने ऐसा किया था। ** ** ** CTransfer के लिए अंतिमकरण लागू नहीं करें। किसी सदस्य को शून्य पर सेट करने से कोई उपयोगी प्रभाव नहीं पड़ता है और इसकी निपटान() विधि को कॉल करना गलत है। –
@ हंसपैसेंट: CTransfer के अंतिमकर्ता के भीतर किसी सदस्य ऑब्जेक्ट (m_transfer) की निपटान() विधि को कॉल करना गलत क्यों है? जैसा कि मैंने उल्लेख किया है, मुझे पता चला है कि m_transfer के संसाधन ठीक से साफ़ नहीं होते हैं जब मैं उस पर निपटान() नहीं कहता (
obruend