> 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) ) ) );
>
> 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));
    std::cout << voice.reference_count() << " ";//2???
    audio->extensionObject()->AddSourceVoice(voice);//the Audio class maintains a reference (basicly adds to playing set in Audio class)
    //start playback
    sourceVoice->Start(0);

    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)
{}

Where the final refrence counts should be removed:
    for(std::set<Py::ExtensionObject<SourceVoice>>::iterator it=playing->begin();it!=playing->end();++it)
    {
        it->extensionObject()->GetVoice()->GetState(&state);
        if(state.BuffersQueued <= 0)//finished, we can clear this up
        {
            //since erasing invalidates the iterator, we add it to a seperate container to delete later, safly
            finished->push_back(*it);
        }
    }
    //clear up finished sounds
    for(std::vector<Py::ExtensionObject<SourceVoice>>::iterator it=finished->begin();it!=finished->end();++it)
    {
        playing->erase(*it);
    }
    //here the last refrence should be deleted, since the python test code never kept the refrence returned before
    //and nethier the playing or finsihed list now have a refrence to the SourceVoice object
    finished->clear();


Win John Lewis vouchers with BigSnapSearch.com Search now