Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何删除SWIG生成的Python包装中的堆对象? 我正在开发一个Python模块和一个C++库。在C++代码中,我有一个函数,它返回一个堆叠的对象,如下: MyClass* func() { MyClass* myclass = new MyClass(); return myclass; }_C++_Python_Swig - Fatal编程技术网

如何删除SWIG生成的Python包装中的堆对象? 我正在开发一个Python模块和一个C++库。在C++代码中,我有一个函数,它返回一个堆叠的对象,如下: MyClass* func() { MyClass* myclass = new MyClass(); return myclass; }

如何删除SWIG生成的Python包装中的堆对象? 我正在开发一个Python模块和一个C++库。在C++代码中,我有一个函数,它返回一个堆叠的对象,如下: MyClass* func() { MyClass* myclass = new MyClass(); return myclass; },c++,python,swig,C++,Python,Swig,但是当我在Python端使用这个函数时,我不能删除返回的对象 myclass = func() del myclass # still remains in memory 有谁能告诉我如何在Python代码中删除返回的对象吗 我可以将返回值的类型从MyClass*更改为MyClass,这样可以避免内存泄漏。但是我不想触碰C++代码,因为C++库已经在另一个地方使用了。 参见Sigg文档中的%NeaveOb/Cuth>和%Type MeMAP(NeWiFLIP)< /Cult>指令。 引自文件:

但是当我在Python端使用这个函数时,我不能删除返回的对象

myclass = func()
del myclass # still remains in memory
有谁能告诉我如何在Python代码中删除返回的对象吗


我可以将返回值的类型从MyClass*更改为MyClass,这样可以避免内存泄漏。但是我不想触碰C++代码,因为C++库已经在另一个地方使用了。

参见Sigg文档中的%NeaveOb/Cuth>和%Type MeMAP(NeWiFLIP)< /Cult>指令。 引自文件:

某些应用程序中的一个常见问题是管理对象的适当所有权。例如,考虑这样的函数:

如果包装函数blah(),SWIG不知道返回值是新分配的对象。因此,生成的扩展模块可能会产生内存泄漏(SWIG是保守的,除非确定返回的对象是新创建的,否则不会删除对象)

要解决此问题,可以使用%newobject指令向代码生成器提供额外提示。例如:

%newobject的工作方式与%rename和%exception完全相同。换句话说,您可以像以前一样将其附加到类成员和参数化声明。例如:

当提供%newobject时,许多语言模块将安排获取返回值的所有权。这允许该值在不再使用时自动进行垃圾收集。但是,这完全取决于目标语言(语言模块也可以选择忽略%newobject指令)

与%newobject密切相关的是一个特殊的类型映射。“newfree”类型映射可用于取消分配新分配的返回值。它仅适用于已应用%newobject的方法,通常用于清理字符串结果。例如:

在本例中,函数的结果是目标语言中的字符串。由于此字符串是原始结果的副本,因此不再需要strdup()返回的数据。示例中的“newfree”类型映射只是释放了这个内存


这是糟糕的API设计;您可能应该返回一个共享指针。弃用该函数并更改调用者。“我不知道Python是如何工作的。@张伯伦,嗯,一点也不?Python的内存管理是完全自动化的,“共享指针”或“原始指针”甚至没有意义。@ DelnErm我刚才谈到的是C++ API……我不认为这个设计是坏的。您不能在所有环境中使用boost。
Foo *blah() {
   Foo *f = new Foo();
   return f;
}
%newobject blah;
Foo *blah();
%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
...
%typemap(newfree) char * "free($1);";
...
%newobject strdup;
...
char *strdup(const char *s);