谁在python中删除了那个内存?

时间:2014-08-25 21:07:39

标签: python c++ memory wrapper swig

我使用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是为我做这件事还是如何实现?

谢谢!

2 个答案:

答案 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