![](/img/trans.png)
[英]How to prevent <Python.h> of Python 2.7 from including <inttypes.h> in a Python wrapper generated by SWIG?
[英]How to delete a heaped object in the Python wrapper generated with SWIG?
我正在開發一個Python模塊和一個C ++庫。 在C ++代碼中,我有一個函數,它返回一個堆積的對象,如下所示。
MyClass* func()
{
MyClass* myclass = new MyClass();
return myclass;
}
但是當我在Python端使用這個函數時,我無法刪除返回的對象。
myclass = func()
del myclass # still remains in memory
有誰能告訴我如何刪除Python代碼中返回的對象,好嗎?
我可以將返回值的類型從MyClass *更改為MyClass,以便我可以避免此內存泄漏。 但我不想觸及C ++代碼,因為C ++庫已經在另一個地方使用了。
請參閱SWIG文檔的第11.2節中的%newobject
和%typemap(newfree)
指令。
引自文檔:
某些應用程序中的常見問題是管理對象的正確所有權。 例如,考慮這樣的函數:
Foo *blah() {
Foo *f = new Foo();
return f;
}
如果你包裝函數blah(),SWIG不知道返回值是新分配的對象。 因此,生成的擴展模塊可能會產生內存泄漏(SWIG是保守的,並且永遠不會刪除對象,除非它確實知道返回的對象是新創建的)。
要解決此問題,可以使用%newobject指令為代碼生成器提供額外的提示。 例如:
%newobject blah;
Foo *blah();
%newobject與%rename和%exception完全相同。 換句話說,您可以像以前一樣將它附加到類成員和參數化聲明。 例如:
%newobject ::blah(); // Only applies to global blah
%newobject Object::blah(int,double); // Only blah(int,double) in Object
%newobject *::copy; // Copy method in all classes
...
當提供%newobject時,許多語言模塊將安排獲取返回值的所有權。 這允許值在不再使用時自動進行垃圾回收。 但是,這完全取決於目標語言(語言模塊也可以選擇忽略%newobject指令)。
與%newobject密切相關的是一個特殊的typemap。 “newfree”類型映射可用於釋放新分配的返回值。 它僅適用於已應用%newobject的方法,通常用於清除字符串結果。 例如:
%typemap(newfree) char * "free($1);";
...
%newobject strdup;
...
char *strdup(const char *s);
在這種情況下,函數的結果是目標語言中的字符串。 由於此字符串是原始結果的副本,因此不再需要strdup()返回的數據。 示例中的“newfree”類型映射只是釋放此內存。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.