Python:使用free()时调用C函数崩溃
我尝试用C语言为Python做一个扩展。我以前从未这样做过。不管C中的函数将做什么,问题如下。我使用malloc来分配内存。但是当我使用free函数时 setup.py: 我使用:python setup.py install安装模块。 但在我打字之后: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是一个选项。任何帮助都将不胜感激 编辑: 所以我设法运行了以前版本
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!!");
}