【发布时间】:2014-08-25 21:07:38
【问题描述】:
我使用 SWIG 来生成包装器。因此我需要一个看起来像
的函数%inline %{
// Serializes into a string
void* SerCmd(Class *v, int *length, char *str)
{
QByteArray ba;
QDataStream out(&ba, QIODevice::WriteOnly);
out << *v;
*length = ba.size();
str = new char[ba.size()];
memcpy(str, ba.constData(), ba.size());
return str;
}
%}
这个函数是从python调用的,但是谁在删除我用new分配的内存? python 是为我做的,还是如何实现的?
谢谢!
【问题讨论】:
-
我不知道 SWIG,但我不知道 SWIG 怎么会知道
str被分配了new[]而不是new甚至malloc。所以 SWIG,除非有我不知道的合约,否则不会知道如何删除内存(更不用说什么时候删除它了)。 -
我正在四处奔走,但也许这会对你有所帮助? swig.org/Doc1.3/Library.html#Library_stl_cpp_library。如果您使用 std::string 而不是原始 char 指针,则通过引用传递一个空的 std::string,并将其填充到您的函数中。至少,这是我认为应该起作用的(记住我不是 SWIG 专家)。
-
@PaulMcKenzie:std::string 是不可能的,因为生成的 char * 可能包含 \0。
-
@Oktalist:也许我错了,但这是因为我想使用类型映射,这是我发现使用指针并将其取回 (INOUT) 的方式。
标签: python c++ memory wrapper swig