gpt4 book ai didi

python - 用 Python 封装 C; free(char *) 无效指针

转载 作者:行者123 更新时间:2023-11-30 15:34:38 25 4
gpt4 key购买 nike

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

你好.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 * 指针。 这是代码失败并出现运行时错误的地方: “/usr/bin/python”中的错误:free():无效指针: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脚本中,并且它的成员函数应该可以访问,并且已经证明可以通过无效指针错误异常。我在这上面花了很多时间但没有成功。请帮忙。

最佳答案

根据the documentation ,由 PyArg_ParseTuple() 生成的指针不应被释放:

Also, you won’t have to release any memory yourself, except with the es, es#, et and et# formats.

消除 free(result); 调用应该可以阻止崩溃。

关于python - 用 Python 封装 C; free(char *) 无效指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23204427/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com