[fpc-devel] Reference counting interface objects
Jonas Maebe
jonas.maebe at elis.ugent.be
Thu Oct 16 15:22:53 CEST 2014
On 16 Oct 2014, at 15:02, Adriaan van Os wrote:
> Jonas Maebe wrote:
>> Nothing ever needs to be manually released, regardless of whether
>> it's a VAR or OUT parameter. That's the whole point of automatic
>> reference counting)
>
> I agree for pure Pascal code, where a parameter can be OUT or VAR
> and automatic release will work in both cases. However, I disagree
> for interfacing with external interfaces. It must be clear for the
> bindings-writer that VAR in the bindings instead of (what should
> have been) OUT can cause a memory leak. This is tricky enough that
> it deserves an explanation in the manual. For example, I think (from
> Windows MediaFoundation)
>
> type
> IMFMediaEventGenerator = interface( IUnknown) ...
> ....
> function GetEvent( dwFlags: DWORD; OUT ppEvent:
> IMFMediaEvent): HResult; stdcall;
>
> is correct, whereas
>
> function GetEvent( dwFlags: DWORD; VAR ppEvent:
> IMFMediaEvent): HResult; stdcall;
>
> will leak memory.
No, it won't:
1) if the external code expects it to be "out" and you declare it as
"var": the caller will decrease the reference count and the ppEvent
that you get will have as initial value "nil". You can just assign to
it like normal.
2) if the external code expects it to be "var" and you declare it as
"out": the caller will not do anything and hence the ppEvent will not
be nil. However, assignments to the "out" parameter still cause its
reference count to be decreased. After all, you can assign multiple
times to an "out" parameter, so the compiler cannot assume it's
already nil. The only problem that could happen here is if you would
explicitly write your code in a way that behaves differently depending
on whether the initial value is nil (e.g., assigning something to it
only in one branch of an if-statement, and then later checking whether
it's "still" nil to determine whether you have to assign something
else to it).
Jonas
More information about the fpc-devel
mailing list