- Code: Select all
MODULE A;
IMPORT COM, Log := StdLog;
TYPE
Object = POINTER TO RECORD (COM.IUnknown)
END;
PROCEDURE (o: Object) RELEASE;
BEGIN
Log.String("Object.RELEASE"); Log.Ln;
END RELEASE;
PROCEDURE (o: Object) FINALIZE;
BEGIN
Log.String("Object.FINALIZE"); Log.Ln;
END FINALIZE;
PROCEDURE NewObject (): Object;
VAR o: Object;
BEGIN
NEW(o);
RETURN o;
END NewObject;
PROCEDURE Do*;
VAR obj: COM.IUnknown;
BEGIN
obj := NewObject();
HALT(0);
END Do;
END A.
A.Do
Kernel.Collect
DevDecoder.Decode A
When calling A.Do, obj.Release is not called and reference become leaked causing memory leak. Leaked objects can be confirmad in COM -> Show Interfaces menu. Leaked objects can't be collected by garbage collector.
SEH handler that call IUnknown.Release should be installed to fix issue. SEH handler code generator is already present and used for [guarded] procedures.
Note that Blackbox compiler implements RAII for IUnknown pointers, IUnknown.Release method is called when procedure returns.