我使用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是为我做这件事还是如何实现?
谢谢!
答案 0 :(得分:3)
如果这不能回答您的问题,我会将其删除。但根据SWIG在此处发现的信息:
http://www.swig.org/Doc1.3/Library.html#Library_stl_cpp_library
可以使用std::string
代替手动分配内存。鉴于此信息,可以使用这种信息。
%inline %{
// Serializes into a string
void SerCmd(Class *v, int *length, std::string& str)
{
QByteArray ba;
QDataStream out(&ba, QIODevice::WriteOnly);
out << *v;
*length = ba.size();
str.clear();
str.append(ba.constData(), ba.size());
}
%}
由于您注意到std::string
可以包含NULL,因此处理它的正确方法是使用string::append()
函数。
http://en.cppreference.com/w/cpp/string/basic_string/append
请注意上面链接中的4)
项(空字符完全正常)。请注意std::string
不确定其大小由空字符决定,与C字符串不同。
现在,要获取此数据,请使用string::data()
函数以及string::size()
函数来告诉您字符串中有多少数据。
答案 1 :(得分:0)
我也不知道SWIG,但是既然你问过,“python是否为我做了这个或者如何实现呢?”
Python垃圾收集在它不再在范围内时删除了东西,即不再有任何东西指向它。但是,它无法删除它不知道的东西。这些文档可能有所帮助。
以下是关于内存管理如何工作的文档: https://docs.python.org/2/c-api/memory.html
以下是gc模块的文档,可帮助您更好地控制流程。 https://docs.python.org/2/library/gc.html