Wie vermeidet man Speicherleck mit shared_ptr und SWIG

8

Ich versuche, boost::shared_ptr s zu verwenden, damit ich C ++ - Datei-I / O-Stream-Objekte in meinem Python-Skript verwenden kann. Der generierte Wrapper warnt mich jedoch davor, dass Speicher ausgelaufen ist.

Hier ist eine minimale .i -Datei, die das Problem aufweist:

%Vor%

Hier ist die Warnung:

%Vor%

Gibt es eine Möglichkeit, die .i -Datei zu ändern, um der Schnittstelle mitzuteilen, wie die shared_ptr ordnungsgemäß zu entsorgen ist?

    
Dave 18.09.2013, 17:03
quelle

1 Antwort

9

In Ihrem Beispiel fehlen zwei Teile, um den Destruktor auszuführen:

  1. Da SWIG absolut nichts über std::ofstream weiß, ist das Standardverhalten nichts anderes, als einen undurchsichtigen Handle zu übergeben. Siehe eine weitere Antwort von mir für eine weitere Diskussion.

    Der Fix hier ist, eine leere Definition für std::ofstream in Ihrer Schnittstellendatei zu liefern, um SWIG zu überzeugen, dass es genug weiß, um mehr zu tun, selbst wenn Sie nicht vorhaben, irgendwelche Mitglieder bloßzustellen.

  2. SWIG muss das Typedef selbst sehen - innerhalb des %{ %} wird es direkt an das Ausgabemodul übergeben, nicht im Wrapping selbst.

So wird Ihr Beispiel:

%Vor%

Für zukünftige Verweise können Sie doppelte Inhalte vermeiden, die nur in der .i-Datei mit %inline :

vorkommen %Vor%

Was deklariert, definiert und alles auf einmal umschließt.

    
Flexo 19.09.2013, 20:25
quelle