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

2024-04-19 19:45:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用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是为我这样做的还是如何实现的?你知道吗

谢谢!你知道吗


Tags: 函数newsizestringinlineoutlengthswig
2条回答

如果这不能回答你的问题,我就把它去掉。但根据这里的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可以包含空值,那么正确的处理方法就是使用string::append()函数。你知道吗

http://en.cppreference.com/w/cpp/string/basic_string/append

请注意上面链接中的4)项(空字符完全可以)。请注意,std::string与C字符串不同,它不是通过空字符决定大小的。你知道吗

现在,要获取这些数据,请使用string::data()函数和string::size()函数来告诉您字符串中有多少数据。你知道吗

我也不知道SWIG,但既然你问,“python是为我做的还是如何实现的?”你知道吗

Python垃圾收集删除那些不再在范围内的东西,即不再有任何指向它的东西。但是,它不能删除它不知道的内容。这些文件可能有用。你知道吗

以下是有关内存管理工作原理的文档: https://docs.python.org/2/c-api/memory.html

下面是gc模块的文档,帮助您更好地控制这个过程。 https://docs.python.org/2/library/gc.html

相关问题 更多 >