我尝试在C中为Python做扩展。我以前从未这样做过。无论C中的功能如何,问题如下。我使用malloc来分配内存。但是当我使用free()函数时
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代码中添加了一个函数,并进行了一些小的更改。您可以在下面看到更新的代码..但是现在,我又遇到了同样的问题:/
#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!!");
}
答案 0 :(得分:0)
在调用此代码之前,可能的原因是缓冲区溢出(或其他与内存相关的错误)。直到free()才会检测到这种情况,因为这是内存分配器尝试合并块的时候。
代码看起来很好,所以我建议你在调用这个函数之前先找问题。