On 08/18/2011 09:37 AM, Grant Tang wrote:
I change my vector<> conversion(see it in my last reply) to add specialization for int, float, string etc. I added type check in convertible() function:
Sorry I didn't reply to your last email earlier, but it looks like you're on the right track.
Here's a slightly modified version of your convertible function: static void* convertible(PyObject* obj_ptr) { // Unfortunately, this no longer works on pure iterators, because // they don't necessarily support "obj[0]". // PySequence_Check should work on lists, tuples, and other // things that support __getitem__ with integer arguments. if (!(PySequence_Check(obj_ptr)) { return 0; } // Succeed if there are no items in the sequence. if (PySequence_Size(obj_ptr) == 0) { return obj_ptr; } // PySequence_GetItem takes an int directly; otherwise you'd need // to DECREF the int object you pass to PyObject_GetItem as well. PyObject * first_obj = PySequence_GetItem(obj_ptr, 0); if( !PyObject_TypeCheck(first_obj, &PyFloat_Type) ) { Py_DECREF(first_obj); // avoid memory leaks on failure return 0; } Py_DECREF(first_obj); // avoid memory leaks on success return obj_ptr; }
This time the implicit type conversion works perfectly. But I got a new problem: the memory leak! The memory leak happens only for float type, whenever I convert the float list in python to vector of float in c++, the memory for float list is leaked. I put the call in a function, and called the gc.collect() after exit the function, the memory is still not recycled. Why is the memory of the python list is not freed after exit the scope?
It's the missing Py_DECREF calls; it's only because of a Python implementation detail that you didn't have leaks with the other types. The Python C-API requires you to call Py_DECREF whenever you're done with an object. Alternately, you can put your PyObject pointers in bp::handle<> or bp::object, and they'll be managed automatically.
Jim _______________________________________________ Cplusplus-sig mailing list Cplusplus-sig@python.org http://mail.python.org/mailman/listinfo/cplusplus-sig