Python:当使用free()时调用C函数崩溃

时间:2014-05-26 00:07:41

标签: python c free

我尝试在C中为Python做扩展。我以前从未这样做过。无论C中的功能如何,问题如下。我使用malloc来分配内存。但是当我使用free()函数时

setup.py:

from distutils.core import setup, Extension
setup(name='rpd', version='1.0',  \
      ext_modules=[Extension('rpd', ['RPB.c'])])

我使用:python setup.py install安装模块。 但是在我输入之后:

import rpd
rpd.rpd("No reason to give string")

IDLE GUI冻结并重新启动。而且我没有看到没有在分配的内存上调用free()作为选项。任何帮助将不胜感激。

编辑:

所以我设法运行以前版本的代码,虽然我没有做出任何戏剧性的改变。我仍然无法弄清楚为什么昨天相同的代码不起作用。然后我想向我的完整C代码迈出一步。所以我在RPB.c代码中添加了一个函数,并进行了一些小的更改。您可以在下面看到更新的代码..但是现在,我又遇到了同样的问题:/

RPB.c:

 #include "Python.h"

 char** tokenize(const char* input)
 {
    char* str = strdup(input);
    int count = 0;
    int capacity = 8;
    char** result = malloc(capacity*sizeof(*result));

    char* tok=strtok(str," ");

    while(1)
    {
        if (count >= capacity)
            result = realloc(result, (capacity*=2)*sizeof(*result));

        result[count++] = tok? strdup(tok) : tok;

        if (!tok) break;

        tok=strtok(NULL," ");
    }

    // When this line is executed... b00m!
    free(str);
    return result;
}

static PyObject* rpd(PyObject *self, PyObject *args){

    char *filename, **test;
    if (!PyArg_ParseTuple(args, "s", &filename)) {
        return Py_BuildValue("s", "Error during reading passed parameters!");
    }

    // test = malloc(strlen(filename)+1);

    test = tokenize(filename);

    // This is never returned due to free in tokenize - placed here for debug purposes
    return Py_BuildValue("s", "What again?!");

    // When this line is executed... b00m!
    //free(test);

    // This is never returned, because program crashes
    //return Py_BuildValue("s", "Everything ok");

}

static char rpd_docs[] ="rpd(c): Give a filename!\n";

static PyMethodDef rpd_funcs[] = {
        {"rpd", (PyCFunction)rpd,
         METH_VARARGS, rpd_docs},
        {NULL, NULL, 0, NULL}
};

void initrpd(void)
{
      Py_InitModule3("rpd", rpd_funcs, "Give a filename!!");
}

1 个答案:

答案 0 :(得分:0)

在调用此代码之前,可能的原因是缓冲区溢出(或其他与内存相关的错误)。直到free()才会检测到这种情况,因为这是内存分配器尝试合并块的时候。

代码看起来很好,所以我建议你在调用这个函数之前先找问题。