2011-09-29 16 views
7

ऐसी परियोजना पर काम करना जो वस्तुओं का निर्माण करने के लिए कारखानों का उपयोग करता है। मैं पॉइंटर्स को विश्व स्तर पर युद्धों में कारखाने के कार्यों में रखता हूं (मुझे पता है) और उन्हें प्रारंभिकरण पर पंजीकृत करें।डेल्फी मेमोरी इश्यू (फास्टएमएम 4)

मुझे हाल ही में यह देखने में दिलचस्पी थी कि प्रोजेक्ट में मेमोरी लीक है तो फास्टएमएम 4 डाउनलोड करने का फैसला करें और देखें। यह कुछ त्रुटियों के साथ आया जो मैं ठीक कर सकता था लेकिन यह मुझे लगता है कि मैं नीचे दिए गए कोड में दिखाए गए कारखाने से संबंधित स्मृति को मुक्त नहीं कर रहा हूं, मुझे एक छोटी सी स्मृति रिसाव मिल रही है। हास्यास्पद लेकिन फिर भी परेशान नहीं है।

मेमोरी को मुक्त करने के लिए मैं क्या उपयोग करूंगा (यदि यह है) मैंने कोशिश की है (@factoryfunction) लेकिन सब कुछ उलझन में लग रहा है। मैं कम स्तर के पॉइंटर सामान के साथ बहुत अच्छा नहीं हूं हमेशा मुझसे बाहर नरक को भ्रमित करता है ताकि कोई मदद कर सके तो यह बहुत अच्छा होगा।

मैंने नीचे एक उदाहरण शामिल किया है कि मैंने अभी अपने सिर के शीर्ष को लिखा है जो मेरी समस्या का वर्णन करता है।

चीयर्स,

बैरी

unit Test; 

interface 

uses classes; 

type 

TAFactoryFunction = reference to function (const aType : integer): TObject; 

function testfunction (const aType : integer) : TObject; 

implementation 

function testfunction(const aType: integer) : TObject; 
begin 
    result := TObject.Create; 
end; 

var 
    FactoryFunction : TAFactoryFunction 

initialization 
    FactoryFunction := testfunction; 

finalization 
    // possibly some freemem code here? 

end. 
+0

मैं उत्सुक हूं - आप एक साधारण फ़ंक्शन प्रकार के बजाय "फ़ंक्शन का संदर्भ" क्यों उपयोग कर रहे हैं? यह मेमोरी रिसाव से बच जाएगा क्योंकि इसमें हुप्स के माध्यम से कंपाइलर कूदना शामिल नहीं होगा जिससे कि अधिक आसानी से हासिल किया जा सके। या यह उन मामलों में से एक है जहां सरलीकृत उदाहरण मूल परिदृश्य को पूरी तरह से प्रतिबिंबित नहीं करता है? – Deltics

+0

बस इसके साथ टाइपिंग के रिश्तेदार ढीलेपन की तरह, तो चर प्रक्रियाओं, विधियों या अज्ञात तरीकों को ले सकते हैं। इसका उपयोग ढांचे के लिए किया जा रहा है, इसलिए इसे यथासंभव एक्स्टेंसिबल बनाना चाहते हैं। – Barry

+0

मुझे यकीन नहीं है कि यह प्राप्त करता है, हालांकि, है ना? संदर्भ अभी भी उचित हस्ताक्षर के एक समारोह के लिए होना चाहिए, नहीं? यदि नहीं तो मैं कहूंगा कि इस तरह की चीज से बचने का कारण यह है कि प्लेग !! अगर मैं एक निश्चित हस्ताक्षर के साथ एक समारोह के रूप में एक प्रकार की घोषणा करता हूं तो यह अच्छी तरह से इस तरह इस्तेमाल किया जा सकता है। कुछ और रखरखाव सिरदर्द के लिए पूछ रहा है (भ्रम का उल्लेख नहीं)। और सवाल बनी हुई है, आप इस लचीलेपन को क्यों अनुमति देना चाहते हैं, इसके अलावा आप चाहते हैं कि आप चाहते हैं? लचीलापन आपके ढांचे में क्या उद्देश्य प्रदान करता है? – Deltics

उत्तर

5

मैं सिर्फ डेल्फी 2010 में यह परीक्षण किया है और यह एक बग प्रतीत होता है। कंपाइलर को इसे साफ़ करने के लिए कोड उत्पन्न करना चाहिए, लेकिन ऐसा नहीं है। यहां तक ​​कि FactoryFunction := nil लिखना, जैसा कि डेविड ने सुझाव दिया था, काम नहीं करता है।

आपको इसे क्यूसी में एक त्रुटि के रूप में रिपोर्ट करनी चाहिए।

+0

'इंटफॉपी' के लिए एक अतिरिक्त कॉल प्रतीत होता है जिसके परिणामस्वरूप संदर्भ गणना 2 पर सेट की जाती है। कोई विचार नहीं कि ऐसा क्यों है। –

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