मैं यह पता लगाने की कोशिश कर रहा हूं कि क्या मेमोरी के एक ब्लॉक को मुक्त नहीं किया गया था। बेशक, प्रबंधक मुझे बताता है कि संवाद बॉक्स या लॉग फ़ाइल द्वारा, लेकिन क्या होगा अगर मैं एक डेटाबेस में परिणाम स्टोर करना चाहूंगा? उदाहरण के लिए, मैं एक डेटाबेस तालिका में दिनचर्या का नाम देना चाहूंगा जिसे दिए गए ब्लॉक आवंटित किए गए हैं।
FastMM के एक दस्तावेज को पढ़ने के बाद मुझे पता है कि संस्करण 4.98 के बाद से हमारे पास प्रबंधक द्वारा अधिसूचित होने की संभावना है कि वे स्मृति आबंटन, फ़्रीज़ और रिअलोकेशन के बारे में जानकारी प्राप्त करें। उदाहरण के लिए OnDebugFreeMemFinish
घटना हमारे लिए गुजर रही है PFullDebugBlockHeader
जिसमें उपयोगी सूचना है। एक चीज है PFullDebugBlockHeader
जो गायब है - सूचना यदि दिए गए ब्लॉक को एप्लिकेशन द्वारा मुक्त किया गया था।
जब तक OnDebugFreeMemFinish
केवल मुक्त ब्लॉक नहीं कहा जाता है? यह वह है जिसे मैं नहीं जानता और इसका पता लगाना चाहूंगा।
समस्या यह है कि यहां तक कि हुकिंग में भी OnDebugFreeMemFinish
घटना मैं यह पता लगाने में असमर्थ था कि ब्लॉक को मुक्त किया गया था या नहीं।
यहाँ एक उदाहरण है:
program MemLeakTest;
{$APPTYPE CONSOLE}
uses
FastMM4, ExceptionLog, SysUtils;
procedure MemFreeEvent(APHeaderFreedBlock: PFullDebugBlockHeader; AResult: Integer);
begin
//This is executed at the end, but how should I know that this block should be freed
//by application? Unless this is executed ONLY for not freed blocks.
end;
procedure Leak;
var
MyObject: TObject;
begin
MyObject := TObject.Create;
end;
begin
OnDebugFreeMemFinish := MemFreeEvent;
Leak;
end.
मुझे जो याद आ रहा है वह कॉलबैक है:
procedure OnMemoryLeak(APointer: PFullDebugBlockHeader);
FastMM के स्रोत को ब्राउज़ करने के बाद मैंने देखा कि एक प्रक्रिया है:
procedure LogMemoryLeakOrAllocatedBlock(APointer: PFullDebugBlockHeader; IsALeak: Boolean);
जिसे खत्म किया जा सकता है, लेकिन शायद एक आसान तरीका है?
OnDebugFreeMemFinish
यह कहा जाता है कि ब्लॉक को मुक्त कर दिया गया था। कोई OnMemoryLeak
घटना नहीं है । ऐसी घटना कभी नहीं हो सकती है। फास्टएमएम क्या करता है, शटडाउन पर, यह निर्धारित करें कि जिन ब्लॉकों को मुक्त नहीं किया गया है, उन्हें लीक होना चाहिए। यह उससे पहले किसी रिसाव का पता नहीं लगा सकता।
AppendEventLog
लेकिन आपको मुझे संदेह है कि FastMM स्रोत को संशोधित करना होगा।