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

Python:使用free()时调用C函数崩溃,python,c,free,Python,C,Free,我尝试用C语言为Python做一个扩展。我以前从未这样做过。不管C中的函数将做什么,问题如下。我使用malloc来分配内存。但是当我使用free函数时 setup.py: 我使用:python setup.py install安装模块。 但在我打字之后: import rpd rpd.rpd("No reason to give string") 空闲GUI冻结并重新启动。我不认为在分配的内存上不调用free是一个选项。任何帮助都将不胜感激 编辑: 所以我设法运行了以前版本

我尝试用C语言为Python做一个扩展。我以前从未这样做过。不管C中的函数将做什么,问题如下。我使用malloc来分配内存。但是当我使用free函数时

setup.py: 我使用:python setup.py install安装模块。 但在我打字之后:

import rpd
rpd.rpd("No reason to give string")
空闲GUI冻结并重新启动。我不认为在分配的内存上不调用free是一个选项。任何帮助都将不胜感激

编辑: 所以我设法运行了以前版本的代码,尽管我没有做任何显著的更改。我仍然不明白为什么昨天同样的代码不起作用。然后我想朝着完整的C代码迈出一步。所以我在RPB.c代码中添加了一个函数,并做了一些小改动。您可以在下面看到更新的代码。。但现在,我又遇到了同样的问题:/

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


代码看起来不错,因此我建议您在调用此函数之前查找问题。

您可能应该分配一个以上的strlenfile名称,尽管这取决于神秘代码。你是说你在上面发布的确切代码爆炸了吗?或者爆炸的代码在malloc和free之间有什么区别吗?你确定你的malloc没有失败吗?因为如果它这样做,您将在空0上调用free,从而导致分段错误。根据:malloc和calloc函数返回一个指针,指向为任何类型的变量适当对齐的分配内存。出现错误时,这些函数返回NULL。如果成功调用大小为零的malloc,或者成功调用nmemb或大小等于零的calloc,也可能返回NULL。@7heo.tk free的读取引用。@7heo.tk freeNULL没有问题。@user3674296好的。。。我所做的是:我将您的c代码全部29行复制到一个名为RPB.c的文件中。我将distutils python代码复制到build.py文件中。我执行了它;获取了当前目录中的构建目录symlinked build/lib.linux-x86_64-2.7/rpd.so;并在Python2.7中执行了两行python。一切正常都打印出来了;没问题。不,我没有评论免费的。所以你这边可能有个问题。我正在运行Debian7,并使用Python2.7。
import rpd
rpd.rpd("No reason to give string")
 #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!!");
}