簡體   English   中英

如何刪除使用SWIG生成的Python包裝器中的堆積對象?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM