[C++-sig] Re: (no subject)
David Abrahams
dave at boost-consulting.com
Mon Sep 29 13:31:00 CEST 2003
"Andrew Ellem" <alellem at uwaterloo.ca> writes:
>> Andrew,
>>
>> Clearly the error must be coming from somewhere else, for example a
>> destructor of one of your objects which uses a HANDLE. None of the
>> Boost.Python code manipulates any type called HANDLE.
>>
>
> You are correct in that it is my code that is causing the problem.
> More
>
> specifically, it is that Boost.Python is deleting one of my objects
> when I don't want it to.
>
> My problem is this: In my class's constructor, I create a class that
> is implemented in Python. The constructor takes a pointer to the
> calling class. Some pseudo-code for clarity's sake:
>
> class X { X() { Y y = PythonClass( this ) } }
>
> The problem is that after the __init__ method is called, Boost tries
> to clean up the arguments, which causes my calling class to be
> deleted, hence the crash. So my problem is how do I prevent this?
>
> I'm guessing the problem is that by default Python passes by value,
No, Python passes by reference always.
> and so does Boost. How do I do otherwise? I'm guessing
> call-policies, but in all honesty I'm having some trouble getting my
> head around them all.
Call policies are only for when Python is calling your C++ function.
Does this help? http://www.boost.org/libs/python/doc/v2/ptr.html
>> Yes, it seems like you're taking shots in the dark. Have you tried
>> reading the documentation on Call Policies and/or stepping through
>> the code that's crashing with a debugger?
>
> I've read the documentation, but I admit I don't understand it 100%.
> From what I've read, I need to use a precall policy that tells Boost
> not to manage the variable I'm passing. But I'm really not sure which
> policy does this, or even one exists.
>
> I've been trying to find an example, the closest I can find is from
> the init.html example, which uses with_custodian_and_ward. Is this
> what I want to do? I don't really want to just throw it in and see if
> it works.
>
> Perhaps a better question, where can I find a thorough explanation of
> the way Python, and Boost.Python handle arguments?
Unfortunately nowhere.
--
Dave Abrahams
Boost Consulting
www.boost-consulting.com
More information about the Cplusplus-sig
mailing list