Re: sip: Accessing members results in incorrect/missing data

Phil Thompson <[email protected]>
Newsgroups gmane.comp.python.pyqt-pykde
Message-ID <[email protected]>
On 22/01/2020 21:50, MatthijsBurgh wrote:
> Phil Thompson-5 wrote
>> 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
>> _______________________________________________
>> PyQt mailing list
> 
>> PyQt@
> 
>> https://www.riverbankcomputing.com/mailman/listinfo/pyqt
> 
> In your last changeset (but also the second one), the new frame keeps 
> alive.
> Even after `v3` is assigned a new value. Therefore the unassigned 
> Frame,
> from which only `p` was accessed, stays alive till the end of the 
> Python
> session.
> 
> This happens because `Frame` has a ref to `p`, because of the caching 
> of the
> python object. And `p` has a reference to `Frame`, to keep the class 
> alive,
> to be able to access the member `p`.
> 
> I don't see an easy solution for this at the moment. Do you?

As I said, I don't seem to see the problem. The caching is needed as 
explained in the comments. Did you try gc.collect()?

Phil
_______________________________________________
PyQt mailing list    [email protected]
https://www.riverbankcomputing.com/mailman/listinfo/pyqt
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.