[C++-sig] Memory Leaks In VS.NET 2003 With BOOST_PYTHON_MODULE
Matt
mjkeyes at sbcglobal.net
Fri Oct 7 20:21:45 CEST 2005
Thanks for your reply!
I do apologize for the lack of line breaks - I'm not sure how that happened.
Anywho, I am new to boost, so please bear with me a little bit here :). I
didn't
realize that I could use a handle object like that to handle internal
references
to the PyObject*. However, I have modified the code, and here it is
(modified):
handle<> hInitPtr(PyImport_ImportModule( "Python.SnakeMUD" ));
handle<> hClassPtr(
PyObject_CallMethod(hInitPtr.get(), "CreateInitialHandler", NULL));
object Handler(hClassPtr);
PythonLib::PythonInputHandler *pHandler =
extract<PythonLib::PythonInputHandler*>(Handler);
//so that the returned pHandler doesn't destruct
//from the boost references above
pHandler->SetPyObject(Handler.ptr());
AddInputHandler(pHandler);
I still get the memory leaks, and I'm not doing any IncRef's or DecRef's
anywhere
else. I have commented out all the code, and I receive no memory leaks.
However, when I uncomment even just the first line (the hInitPtr),
I get 17 leaks.
Any advice?
Also, does the above code look reasonable? Like I said, I'm new to boost
so I don't know if it looks clean or not.
Thanks again!
"Ralf W. Grosse-Kunstleve" <rwgk at yahoo.com> wrote in message
news:20051007163924.10208.qmail at web31514.mail.mud.yahoo.com...
> Your posting is missing new-lines and therefore very difficult to read.
>
> Over the last couple of year I ran our 50+ Boost.Python extension
> repeatedly
> with valgrind, incl leak check. It is a very long time ago (3+ years) that
> I
> found the last memory leak in Boost.Python. If there are still memory
> leaks in
> Boost.Python they must be in very obscure places. I'd bet that any leaks
> you
> are seeing are in your code. Seeing manual INCREF and DECREF in your code
> makes
> this seem all the more likely to me. I'd consider using
> boost::python::handle<>
> and boost::python::object to automate the reference counting.
>
> The key to resolving issues like your is always the same: carefully reduce
> your
> code just until the error goes away. Then put back the last code removed
> so
> that the error appears again. Keep reducing the code until you have a
> minimal
> example. If the problem is not in your code, post the minimal example to
> this
> list, complete with information about your platform and instructions how
> to
> compile.
>
> Cheers,
> Ralf
>
> --- Matt <mjkeyes at sbcglobal.net> wrote:
>
>> Hey all,
>>
>> i know i just posted about something else yesterday, but i have found a
>> number of memory leaks that crop up when i use BOOST_PYTHON_MODULE.
>> Here's
>> what it looks like:
>>
>> //NOTE SocketLib and PythonLib are two of my namespaces
>>
>> BOOST_PYTHON_MODULE(PyInputHandler)
>> {
>>
>>
> class_<PythonLib::PythonInputHandler,boost::noncopyable>("PythonInputHandler")
>>
>>
> .def("HandleInput",pure_virtual(&SocketLib::InputHandler<std::string>::HandleInput))
>> .def("Enter",
>> pure_virtual(&SocketLib::InputHandler<std::string>::Enter))
>> .def("Leave", pure_virtual(&SocketLib::InputHandler<std::string>::Leave))
>> .def("Hungup",pure_virtual(&SocketLib::InputHandler<std::string>::Hungup))
>> .def("Flooded",pure_virtual(&SocketLib::InputHandler<std::string>::Flooded))
>> .def("NoRoom",pure_virtual(&SocketLib::InputHandler<std::string>::NoRoom))
>> .def("Quit", &PythonLib::PythonInputHandler::Quit) .def("ShutDown",
>> &PythonLib::PythonInputHandler::ShutDown) .def("SendGlobal",
>> &PythonLib::PythonInputHandler::SendGlobal) .def("AddInputHandler",
>> &PythonLib::PythonInputHandler::AddInputHandler) ;}The leaks (17 of
>> them)
>> come from the init_module_PyInputHandler call that isgenerated from this
>> macro.Here is what I call to instantiate my Python class in C++:
>> PyObject
>> *pInit = PyImport_I!
>> mportModule( "Python.SnakeMUD" ); if( pInit == NULL ) {
>> PyErr_Print();
>> //throw custom exception handling } //call the python method to
>> create
>> our initial input handler handle<> hClassPtr(PyObject_CallMethod(pInit,
>> "CreateInitialHandler",NULL)); //wrap the handle in a boost class
>> object
>> Handler(hClassPtr); //Get out class out of the boost class
>> PythonLib::PythonInputHandler *pHandler
>> =extract<PythonLib::PythonInputHandler*>(Handler); //this will call
>> Py_XINCREF on the PyObject *, which will allow ourhandler to continue to
>> exist after this function exits pHandler->SetPyObject(Handler.ptr());
>> //cleanup the module call Py_XDECREF(pInit); //add our new handler
>> AddInputHandler(pHandler);Nothing really fancy unless i'm doing something
>> completely stupid. Anyadvice?Thanks in advance!Matt
>
>
>
>
> __________________________________
> Yahoo! Mail - PC Magazine Editors' Choice 2005
> http://mail.yahoo.com
More information about the Cplusplus-sig
mailing list