2012-10-31 10 views
5

मैं डेल्फी एक्सई का उपयोग कर रहा हूं। मैं डेल्फी साबुन का उपयोग कर मेमोरी लीक समस्या में आया हूं। यह पता चला होने के लिए TWSDLLookup.Destroy में एक लापता नि: शुल्क कॉल की वजह से, QC 91160TWSDLLookup.Destroy विधि में डेल्फी एक्सई मेमोरी लीक

में वर्णित के रूप समस्या मेरे पास है कि है वर्णित काम के आसपास, जो केवल TWSDLLookup.Destroy विधि के लिए FLookup.Free जोड़ना है।
मैं डेल्फी स्रोत बदलने के लिए नहीं करना चाहते हैं, तो मैं के रूप में टॉम के जवाब में here वर्णित अपने प्रोजेक्ट फ़ोल्डर में इकाई को कॉपी, परिवर्तन और कंपाइल बनाने की कोशिश की,। इस तकनीक के साथ समस्या यह है कि यह स्पष्ट रूप से केवल तभी काम करता है यदि आप सभी निर्भर इकाइयों को फिर से संकलित करते हैं। मैंने अपनी प्रोजेक्ट निर्देशिका में केवल WSDLLookup.pas की प्रतिलिपि बनाने का प्रयास किया है और मुझे स्टैक ओवरफ्लो त्रुटि मिलती है। मैं वेब सर्विसेज/एसओएपी से परिचित नहीं हूं इसलिए मुझे नहीं पता कि अगर मैं इस तकनीक का उपयोग करता हूं तो मुझे अन्य इकाइयों की प्रतिलिपि बनाना चाहिए। एक ही पृष्ठ पर

रोब कैनेडी के जवाब एक अलग कोड hooking शामिल तकनीक का वर्णन - लेकिन यह तरीकों पर आपत्ति करने के लिए लागू करने के लिए प्रतीत नहीं होता। मैंने ऐसा किया है क्योंकि वह टीएनटी यूनिकोड नियंत्रण के लिए मुफ्त कोड सुझाता है और डाउनलोड करता है और प्रासंगिक प्रक्रियाओं को स्थापित करता है, लेकिन मैं ऑब्जेक्ट के तरीकों को कैसे हुक करने के बारे में जानकारी नहीं ढूंढ पा रहा हूं - यदि वास्तव में यह संभव है। अगर मैं ऐसा कर सकता हूं, तो मैं TWSDLLookup.Destroy को हुक करूंगा और FLookup.Free कॉल जोड़ूंगा।

इसे ठीक करने के लिए कोई भी विचार बहुत सराहना की जाएगी। मैं एक नौसिखिया प्रोग्रामर का थोड़ा सा हूँ इसलिए मुझे उम्मीद है कि मैंने कुछ स्पष्ट याद किया है?

उत्तर

3

जो आप करने की कोशिश कर रहे हैं वास्तव में ठीक काम करता है। मैंने इसे स्वयं परीक्षण किया। यहाँ परियोजना फ़ाइल मैं प्रयोग किया जाता है:

program WSDLLookupTest; 

{$APPTYPE CONSOLE} 

uses 
    WSDLLookup in 'WSDLLookup.pas'; 

var 
    intf: IInterface; 

begin 
    intf := GetWSDLLookup as IInterface; 
end. 

मैं WSDLLookup.pas फ़ाइल की एक प्रतिलिपि बना दिया है और .dpr फ़ाइल के रूप में एक ही निर्देशिका में रख दिया। फिर, मूल की बजाय प्रतिलिपि में, मैंने TWSDLLookup.Destroy संशोधित किया।

destructor TWSDLLookup.Destroy; 
begin 
    Beep; 
    ClearWSDLLookup; 
    FLookup.Free; 
    inherited; 
end; 

मुझे लगता है कि इस कोड को वास्तव में क्रियान्वित किया जा रहा था अपने आप को साबित करने के लिए Beep गयी।

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

एक बात संशोधित इकाई को हटाने के लिए जब आप उन्नयन है याद करने के लिए है। रिसाव XE2 में तय किया गया था।

+0

त्वरित जवाब :) –

+0

के लिए धन्यवाद मुझे लगता है कि शायद डिबग dcus के उपयोग के लिए एक समस्या का कारण होता है के बारे में कुछ देखा - संभवतः यही कारण है कि मैं अपने ढेर अतिप्रवाह मिलता है। या शायद मेरे पास एक और बग है। –

+0

वैसे भी, धन्यवाद फिर से। चूंकि यह काम करता है, मैं यह पता लगाने की कोशिश करूंगा कि मैं और क्या कर रहा हूं :) –

संबंधित मुद्दे