我正在用C语言编写一个Python扩展(在Linux(Ubuntu 14.04)上)并遇到动态内存分配问题。我搜索了SO并发现了几个关于free()调用的帖子导致了类似的错误,因为free()试图释放未动态分配的内存。但我不知道下面的代码中是否存在这样的问题:
#include <Python.h>
#include <stdio.h>
#include <stdlib.h>
static PyObject* tirepy_process_data(PyObject* self, PyObject *args)
{
FILE* rawfile = NULL;
char* rawfilename = (char *) malloc(128*sizeof(char));
if(rawfilename == NULL)
printf("malloc() failed.\n");
memset(rawfilename, 0, 128);
const int num_datapts = 0; /* Just Some interger variable*/
if (!PyArg_ParseTuple(args, "si", &rawfilename, &num_datapts)) {
return NULL;
}
/* Here I am going top open the file, read the contents and close it again */
printf("Raw file name is: %s \n", rawfilename);
free(rawfilename);
return Py_BuildValue("i", num_profiles);
}
输出结果为:
Raw file name is: \home\location_to_file\
*** Error in `/usr/bin/python': free(): invalid pointer: 0xb7514244 ***
答案 0 :(得分:4)
这些格式允许将对象作为连续的内存块进行访问。 您不必为返回的unicode或字节区域提供原始存储。此外,您不必自己释放任何内存,除了es,es#,et和et#格式。
(强调我加入)
因此,您无需先使用malloc()
分配内存。之后你也不需要free()
内存。
发生错误是因为您正在尝试释放由Python提供/分配的内存。所以C(malloc / free)无法释放它,因为C运行时是未知的。
答案 1 :(得分:1)
请考虑“PyArg_ParseTuple”的API文档:https://docs.python.org/2/c-api/arg.html
你不应该将指针传递给已分配的内存,也不能在之后释放它。