[PyQt] sip: Accessing members results in incorrect/missing data

Phil Thompson phil at riverbankcomputing.com
Wed Jan 22 15:50:50 GMT 2020


On 22/01/2020 13:57, MatthijsBurgh wrote:
> The first changeset already fixed the issue.
> 
> The newer changeset creates the situation as desribed in
> http://python.6.x6.nabble.com/sip-Accessing-members-results-in-incorrect-missing-data-tp5266521p5266740.html,
> it looks like the release function isn't called anymore. I thought 
> Python GC
> was able to break up circular references, but it looks like it isn't
> happening.
> 
> By running the following code:
> ```
> v = Vector(1,2,3)
> R = Rotation()
> F = Frame(R,v)
> v2 = F.p
> v3 = Frame(F).p
> v3 = Vector(2,3,4)
> ```
> The `release_Frame` is called(print shows up) after the second `v3`
> assignment when using your first changeset, but the print doesn't show 
> up
> with your second changeset, today's one.
> 
> So to me it looks like this will cause a memory leak.

In my own test cases the cycle is broken. Have you run gc.collect()? If 
you print out the reference counts to they look correct?

> Side note: I would prefer the usage of a specific key for the member
> reference to the containing class.
> I don't think using the same key for both references will cause a 
> problem
> with overwriting. As a class can't contain a member of the same type, 
> only a
> member as a pointer to the same type. In which case, the reference 
> isn't
> kept, if I understand the code correct.

There can be a problem (now fixed) if the type of the variable is 
defined in a different module from the type of the container.

Phil


More information about the PyQt mailing list