用Python包装C; free(char *)无效指针

时间:2014-04-21 19:27:03

标签: python c malloc wrapper free

我正在关注使用Python包装C / C ++的this教程。我已逐字复制了示例代码,但仍会在下面列出。

的hello.c

#include <stdio.h>
#include <Python.h>

// Original C Function
char * hello(char * what)
{
    printf("Hello %s!\n", what);
    return what;
}

//  1) Wrapper Function that returns Python stuff
static PyObject * hello_wrapper(PyObject * self, PyObject * args) 
{
  char * input;
  char * result;
  PyObject * ret;

  // parse arguments
  if (!PyArg_ParseTuple(args, "s", &input)) {
    return NULL;
  }

  // run the actual function
  result = hello(input);

  // build the resulting string into a Python object.
  ret = PyString_FromString(result);

  free(result);

  return ret;
}

脚本hello.c定义了一个简单的“hello”函数,以及一个返回Python对象的包装器,并且(假设)释放了c char *指针。 这是代码因运行时错误而失败的地方: Error in '/usr/bin/python': free(): invalid pointer: 0x00000000011fbd44。虽然我认为错误应该仅限于此范围,但为了以防万一,让我们回顾一下包装的其余部分......

hello.c包含在模块的定义中,该模块允许在Python中调用其方法。该模块定义如下:

hellomodule.c

#include "hello.c"
#include <Python.h>

// 2) Python module
static PyMethodDef HelloMethods[] =
{
        { "hello", hello_wrapper, METH_VARARGS, "Say hello" },
        { NULL, NULL, 0, NULL }
};

// 3) Module init function
DL_EXPORT(void) inithello(void)
{
    Py_InitModule("hello", HelloMethods);
}

最后,实现了一个Python脚本来构建模块:

setup.py

#!/usr/bin/python
from distutils.core import setup, Extension

# the c++ extension module
extension_mod = Extension("hello", ["hellomodule.c"]) #, "hello.c"])

setup(name = "hello", ext_modules=[extension_mod])

运行setup.py后,可以将模块导入任何Python脚本,并且其成员函数应该可以访问,并且已经证明是,除了无效指针之外错误。我花了很多时间在这上面无济于事。请帮忙。

1 个答案:

答案 0 :(得分:1)

根据the documentationPyArg_ParseTuple()生成的指针不应被释放:

  

此外,除了es,es#,et和et#格式之外,您不必自己释放任何内存。

取消free(result);电话会停止崩溃。