2009-05-27 11 views
10

Mam bardzo skomplikowaną klasę, dla której próbuję tworzyć wrappery Pythona w SWIG. Kiedy utworzyć wystąpienie elementu w Pythonie, jednak jestem w stanie zainicjować niektórych członków danych bez otrzymania wiadomości:Wykryto przeciek pamięci Swig/Pythona

>>> myVar = myModule.myDataType() 
swig/python detected a memory leak of type 'MyDataType *', no destructor found. 

Czy ktoś wie, co należy zrobić, aby rozwiązać ten? Czy istnieje flaga, której mogę użyć do generowania destruktorów?

+1

Powiązane pytanie: http://stackoverflow.com/questions/13587791/swig-and-c-memory-leak-with-vector-of-pointers/13593596#13593596 – Flexo

Odpowiedz

-7

Komunikat o błędzie jest dla mnie całkiem jasny, musisz zdefiniować destruktor dla tego typu.

+2

To nie jest poprawne. Całkowicie możliwe jest zdefiniowanie destruktora lub użycie domyślnego domyślnego destruktora i nie zobaczenie tego błędu. Ważne jest to, że SWIG wie o istnieniu takiego destruktora. Zobacz: http://stackoverflow.com/questions/13587791/swig-and-c-memory-leak-with-vector-of-pointers/13593596#13593596 – Flexo

8

SWIG zawsze generuje wrappery destruktora (chyba że użyto dyrektywy %nodefaultdtor). Jednak w przypadku, gdy nie wie nic o typie, wygeneruje nieprzezroczyste opakowanie wskaźnika, które spowoduje wycieki (i powyższy komunikat).

Proszę sprawdzić, czy myDataType jest typem znanym ze SWIG. Ponowne uruchomienie SWIG z komunikatami debugowania włączony i sprawdzić ewentualne komunikaty podobne do

Nothing is known about Foo base type - Bar. Ignored 

odbierając komunikat jak wyżej oznacza, że ​​SWIG nie zna hierarchię typu w pełnym zakresie, a tym samym działa na ograniczone informacje - co może spowodować, że nie wygeneruje dtor.

+0

Która flaga debugowania SWIG powinna być włączona? Niektóre z nich produkują strasznie dużo informacji. Pod jaką flagą powinienem szukać wiadomości, o których wspomniałeś? – Michal

Powiązane problemy