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