【问题标题】:Who deletes that memory in python?谁在python中删除了那个内存?
【发布时间】: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 专家)。
  • 不清楚你想做什么。您忽略了str 参数的值并以调用者不可见的方式在本地更改它,然后您将其返回为void*。无论如何,请查看 SWIG 手册部分 5.2.512.2
  • @PaulMcKenzie:std::string 是不可能的,因为生成的 char * 可能包含 \0。
  • @Oktalist:也许我错了,但这是因为我想使用类型映射,这是我发现使用指针并将其取回 (INOUT) 的方式。

标签: python c++ memory wrapper swig


【解决方案1】:

如果这不能回答您的问题,我将删除它。但根据此处找到的 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() 函数来告诉您字符串中有多少数据。

【讨论】:

  • 我是按照以下方式进行的 std::string SerCmd(Class *v, int *length) { QByteArray ba; QDataStream out(&amp;ba, QIODevice::WriteOnly); out &lt;&lt; *v; std::string str; str.append(ba.constData(), ba.size()); return str; } 因为它不能以另一种方式工作。
【解决方案2】:

我也不知道 SWIG,但既然你问,“python 是在为我做这件事,还是如何做到这一点?”

Python 垃圾回收会在它不再在范围内时删除东西,即不再有任何指向它的东西。但是,它不能删除它不知道的东西。这些文档可能会有所帮助。

这是关于内存管理如何工作的文档: https://docs.python.org/2/c-api/memory.html

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

【讨论】:

  • 这根本不是答案。 “我也不知道 SWIG”,但 OP 专门询问 SWIG 如何处理它。
  • @whitebeard GC 只能删除它知道存在的东西,因为它是在 Python 程序中分配的,它不会删除由某些甚至不是用 Python 编写的并行库分配的东西.
  • @C.R.不,他问“python 是在为我做这件事,还是如何实现?”
  • @Havenard 是的,我知道。它在我引用的文档中。我将其添加到我的答案中。
  • @whitebeard:您没有回答“python 是为我这样做还是如何实现?”的问题。因为您只回答了 Python 如何处理通过正常方式创建的对象,而不是通过 SWIG。
猜你喜欢
  • 2019-06-15
  • 2014-05-03
  • 1970-01-01
  • 2022-12-14
  • 2013-05-10
  • 2019-04-19
  • 2019-04-28
  • 2011-02-26
  • 2013-09-09
相关资源
最近更新 更多