Я использую SWIG для взаимодействия между С++ и Python. Я создал функцию, которая создает указатели объектов std::vector. Объекты, на которые указывают, в этом случае не важны.
Проблема заключается в том, что когда объект (someObject
) выходит за пределы области действия на стороне Python, он не может освобождать память, на которую указывают указатели объекта/указателя внутри вектора, что вызывает утечку памяти.
Пример
-
Код С++:
std::vector < someObject* > createSomeObjectForPython() { std::vector < someObject* > myVector; someObject* instanceOfSomeObject = new someObject(); myVector.push_back(instanceOfSomeObject); return myVector; }
-
Из интерпретатора Python:
objectVar = createSomeObjectForPython()
Когда я запускаю это в Python, я получаю эту ошибку:
swig/python detected a memory leak of type 'std::vector< someObject *,std::allocator< someObject * > > *', no destructor found.
Эта ошибка возникает из-за того, что когда Python удаляет вектор, он может удалять указатели внутри вектора, а не то, на что они указывают.
Если бы я мог создать деструктор для std::vector, это был бы ответ, но это не возможно.
Мне действительно нужно использовать векторы указателей, противоположных векторам объектов, прежде чем кто-либо предложит это как решение, особенно потому, что объекты большие и сложные, а скорость - проблема.
Я использую gcc4.4, swigwin 2.0.4 и Python 2.7 для Windows.