使用free()时指针错误无效

时间:2014-12-17 16:10:05

标签: python c free dynamic-memory-allocation

我正在用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 ***

2 个答案:

答案 0 :(得分:4)

根据documentation

  

这些格式允许将对象作为连续的内存块进行访问。 您不必为返回的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

你不应该将指针传递给已分配的内存,也不能在之后释放它。