On 1 Jan 2009, at 23:56, William Newbery wrote:

> In cases like this I use a pointer:
> Py::ExtensionObject<Input> *input_ptr;
> and new a Py::ExtensionObject<Input>( input ) when I have it available.
> You need to create the the Py::Object to pass it back to python like 
> this:
> Py::ExtensionObject<Input> an_input_object( Py::asObject( new 
> Input(this, hwnd) ) ) );

You are not use asObject...

> I've been looking at allowing Py::Object to hold NULL for V6.0.0 - but 
> that targeted at Python 3.0.
> Barry

Ok, I did as you said and used the Py::ExtensionObject, however I seem to be back where I started with object not being deleted :(

The problem seems to be that somehow it thinks it still refrenced when its not, that is when I checked the refrence count before destroying what should be the final refrence it reports a count of 2. Whats more when the object is first created the count seems to start at 2...

Where the object is created
    //create voice object
    Py::ExtensionObject<SourceVoice> voice(new SourceVoice(sourceVoice, Py::ExtensionObject<Sound>(this), loop));

You are not using Py::asObject...

    std::cout << voice.reference_count() << " ";//2???

I'd expect it to be 0 given the error with Py::asObject

Make the asObject change and see what you get.

    audio->extensionObject()->AddSourceVoice(voice);//the Audio class maintains a reference (basicly adds to playing set in Audio class)
    //start playback

    std::cout << voice.reference_count() << std::endl;//3, as exspected since refrence was 2 before
    return voice;//in my tests this return value was not used

The objects constructor - I see nothing here to create a 2nd refrence to itself, only an extra refrence to the Sound object
SourceVoice::SourceVoice(IXAudio2SourceVoice *_voice, Py::ExtensionObject<Sound> _sound, bool _isLooping)
:voice(_voice), isLooping(_isLooping), isPaused(false), sound(_sound)

If you print the ref count in the c'tor it should be 0.