C包装函数,崩溃Python? [英] C Wrapper Function, crashing Python?

查看:67
本文介绍了C包装函数,崩溃Python?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

//这会将结果存储在Python对象中

PyObject * finalResult;


//从Python获取参数

char * result = 0;

char * in = 0;

char * aString = 0;

char * bString = 0;

MY_NUM * a;

MY_NUM * b;

int ok = PyArg_ParseTuple(args," sss",& in,& aString,& bString);

if(!ok)返回0;


//努力获得a和b

// count - 返回一个int; GetVal - 返回一个字符*

a = GetVal(aString,count(aString,","));

b = GetVal(bString,count(bString,") ,);;


// make函数调用,返回char *

result = doStuff(in,a,b);


//将结果保存在Python字符串中

finalResult = PyString_FromString(result);


//可用内存

PyMem_Free(结果);

PyMem_Free(a);

PyMem_Free(b);


/ /返回结果作为Python字符串

返回finalResult;

}


....来自python我可以称之为功能4次......工作正常。当我第二次调用它时,python.exe崩溃了。即时思考一些内存

问题在包装函数中也许......但我不确定。

实际上是C函数,doStuff可以被称为5,6,7 ...... N次没有

问题

所以我知道它的必须是我的包装。


任何想法?谢谢!

static PyObject *wrap_doStuff(PyObject *self, PyObject *args) {
// this will store the result in a Python object
PyObject *finalResult;

// get arguments from Python
char *result = 0;
char *in= 0;
char *aString = 0;
char *bString = 0;
MY_NUM *a;
MY_NUM *b;
int ok = PyArg_ParseTuple(args, "sss", &in, &aString, &bString);
if (!ok) return 0;

// do work to get a and b
// count - returns an int; GetVal - returns a char *
a = GetVal(aString, count(aString, ","));
b = GetVal(bString, count(bString, ","));

// make function call, which returns a char *
result = doStuff(in, a, b);

// save result in Python string
finalResult = PyString_FromString(result);

// free memory
PyMem_Free(result);
PyMem_Free(a);
PyMem_Free(b);

// return the result as a Python string
return finalResult;
}

....from python I can call this function 4 times...works fine. WHen I
call it for the fifth time python.exe crashes. im thinking some memory
problem in the wrapper function perhaps...but I am not sure. The
actually C function, doStuff can be called 5, 6,7...N times without a
problem
so i know its gotta be my wrapper.

Any ideas? Thanks!

推荐答案

更新:

如果我使用C'的免费(结果),免费(a)免费(b)而不是PyMem_Free ......我只需要一个成功使用/调用doStuff即可。




//这个有效

doStuff(...)

// python在这里崩溃

doStuff(.. 。)


Java和Swing写道:
update:
if I use C''s free(result), free(a) free(b) instead of PyMem_Free...I
only get one successfuly use/call of doStuff.

i.e.
// this works
doStuff(...)

// python crashes here
doStuff(...)

Java and Swing wrote:
static PyObject * wrap_doStuff(PyObject * self,PyObject * args){
//这将存储Python对象中的结果
PyObject * finalResult;

//从Python获取参数
char * result = 0;
char * in = 0;
char * aString = 0;
char * bString = 0;
MY_NUM * a;
MY_NUM * b;
int ok = PyArg_ParseTuple(args," sss", & in,& aString,& bString);
if(!ok)返回0;

//努力获得a和b
//计数 - 返回一个int; GetVal - 返回一个char *
a = GetVal(aString,count(aString,","));
b = GetVal(bString,count(bString,","));

//进行函数调用,返回一个char *
result = doStuff(in,a,b);

//将结果保存在Python字符串
finalResult = PyString_FromString(结果);

//可用内存
PyMem_Free(结果);
PyMem_Free(a);
PyMem_Free(b); < //返回结果作为Python字符串
返回finalResult;
}
...来自python我可以调用这个函数4次.. 。工作良好。我第五次调用它时python.exe崩溃了。我在包装函数中思考一些记忆问题或许......但我不确定。实际上是C函数,doStuff可以被称为5,6,7 ...... N次没有问题
所以我知道它必须是我的包装。
有什么想法吗?谢谢!
static PyObject *wrap_doStuff(PyObject *self, PyObject *args) {
// this will store the result in a Python object
PyObject *finalResult;

// get arguments from Python
char *result = 0;
char *in= 0;
char *aString = 0;
char *bString = 0;
MY_NUM *a;
MY_NUM *b;
int ok = PyArg_ParseTuple(args, "sss", &in, &aString, &bString);
if (!ok) return 0;

// do work to get a and b
// count - returns an int; GetVal - returns a char *
a = GetVal(aString, count(aString, ","));
b = GetVal(bString, count(bString, ","));

// make function call, which returns a char *
result = doStuff(in, a, b);

// save result in Python string
finalResult = PyString_FromString(result);

// free memory
PyMem_Free(result);
PyMem_Free(a);
PyMem_Free(b);

// return the result as a Python string
return finalResult;
}

...from python I can call this function 4 times...works fine. WHen I
call it for the fifth time python.exe crashes. im thinking some memory
problem in the wrapper function perhaps...but I am not sure. The
actually C function, doStuff can be called 5, 6,7...N times without a
problem
so i know its gotta be my wrapper.

Any ideas? Thanks!






还有一个更新...


如果我删除PyMem_Free并且免费( ...)...所以没有记忆清理......我可以

仍然只调用doStuff 4次,第5次尝试崩溃Python。


Java和Swing写道:
one more update...

if I remove PyMem_Free and free(...) ...so no memory clean up...I can
still only call doStuff 4 times, the 5th attemp crashes Python.

Java and Swing wrote:
更新:
如果我使用C'的免费(结果),免费(a)免费(b)而不是PyMem_Free ...我
只有一个成功使用/调用doStuff。

//这个工作
doStuff(...)

// python在这里崩溃
doStuff(...)

Java和Swing写道:
update:
if I use C''s free(result), free(a) free(b) instead of PyMem_Free...I
only get one successfuly use/call of doStuff.

i.e.
// this works
doStuff(...)

// python crashes here
doStuff(...)

Java and Swing wrote:
static PyObject * wrap_doStuff(PyObject * self,PyObject * args){
/ /这会将结果存储在Python对象中。
PyObject * finalResult;

//从Python获取参数
char * result = 0;
char * in = 0;
char * aString = 0;
char * bString = 0;
MY_NUM * a;
MY_NUM * b;
int ok = PyArg_ParseTuple(args, " sss",& in,& aString,& bString);
if if(!ok)返回0;

//做工作得到a和b
// count - 返回一个int; GetVal - 返回一个char *
a = GetVal(aString,count(aString,","));
b = GetVal(bString,count(bString,","));

//进行函数调用,返回一个char *
result = doStuff(in,a,b);

//将结果保存在Python字符串
finalResult = PyString_FromString(结果);

//可用内存
PyMem_Free(结果);
PyMem_Free(a);
PyMem_Free(b); < //返回结果作为Python字符串
返回finalResult;
}
...来自python我可以调用这个函数4次.. 。工作良好。我第五次调用它时python.exe崩溃了。我在包装函数中思考一些记忆问题或许......但我不确定。实际上是C函数,doStuff可以被称为5,6,7 ...... N次没有问题
所以我知道它必须是我的包装。
有什么想法吗?谢谢!
static PyObject *wrap_doStuff(PyObject *self, PyObject *args) {
// this will store the result in a Python object
PyObject *finalResult;

// get arguments from Python
char *result = 0;
char *in= 0;
char *aString = 0;
char *bString = 0;
MY_NUM *a;
MY_NUM *b;
int ok = PyArg_ParseTuple(args, "sss", &in, &aString, &bString);
if (!ok) return 0;

// do work to get a and b
// count - returns an int; GetVal - returns a char *
a = GetVal(aString, count(aString, ","));
b = GetVal(bString, count(bString, ","));

// make function call, which returns a char *
result = doStuff(in, a, b);

// save result in Python string
finalResult = PyString_FromString(result);

// free memory
PyMem_Free(result);
PyMem_Free(a);
PyMem_Free(b);

// return the result as a Python string
return finalResult;
}

...from python I can call this function 4 times...works fine. WHen I
call it for the fifth time python.exe crashes. im thinking some memory
problem in the wrapper function perhaps...but I am not sure. The
actually C function, doStuff can be called 5, 6,7...N times without a
problem
so i know its gotta be my wrapper.

Any ideas? Thanks!






Op 2005-10-12,Java and Swing schreef< co ******* @ gmail.com>:
Op 2005-10-12, Java and Swing schreef <co*******@gmail.com>:
static PyObject * wrap_doStuff(PyObject * self,PyObject * args){
//这会将结果存储在Python对象中
PyObject * finalResult ;

//从Python获取参数
char * result = 0;
char * in = 0;
char * aString = 0;
char * bString = 0;
MY_NUM * a;
MY_NUM * b;
int ok = PyArg_ParseTuple(args," sss",& in,& aString,& bString);
如果(!ok)返回0;

//做工作得到a和b
// count - 返回一个int; GetVal - 返回一个char *
a = GetVal(aString,count(aString,","));
b = GetVal(bString,count(bString,","));

//进行函数调用,返回一个char *
result = doStuff(in,a,b);

//将结果保存在Python字符串
finalResult = PyString_FromString(结果);

//可用内存
PyMem_Free(结果);
PyMem_Free(a);
PyMem_Free(b); < //返回结果作为Python字符串
返回finalResult;
}
...来自python我可以调用这个函数4次.. 。工作良好。我第五次调用它时python.exe崩溃了。我在包装函数中思考一些记忆问题或许......但我不确定。实际上是C函数,doStuff可以被称为5,6,7 ...... N次没有问题
所以我知道它必须是我的包装。
有什么想法吗?谢谢!
static PyObject *wrap_doStuff(PyObject *self, PyObject *args) {
// this will store the result in a Python object
PyObject *finalResult;

// get arguments from Python
char *result = 0;
char *in= 0;
char *aString = 0;
char *bString = 0;
MY_NUM *a;
MY_NUM *b;
int ok = PyArg_ParseTuple(args, "sss", &in, &aString, &bString);
if (!ok) return 0;

// do work to get a and b
// count - returns an int; GetVal - returns a char *
a = GetVal(aString, count(aString, ","));
b = GetVal(bString, count(bString, ","));

// make function call, which returns a char *
result = doStuff(in, a, b);

// save result in Python string
finalResult = PyString_FromString(result);

// free memory
PyMem_Free(result);
PyMem_Free(a);
PyMem_Free(b);

// return the result as a Python string
return finalResult;
}

...from python I can call this function 4 times...works fine. WHen I
call it for the fifth time python.exe crashes. im thinking some memory
problem in the wrapper function perhaps...but I am not sure. The
actually C function, doStuff can be called 5, 6,7...N times without a
problem
so i know its gotta be my wrapper.

Any ideas? Thanks!




假设你的doStuff是一个对python一无所知的C函数。

它可能是PyMem_Free(结果)。
http://docs.python.org/api/memoryInterface.html 说出以下内容:


void PyMem_Free(void * p)

释放p指向的内存块,必须是

由之前调用PyMem_Malloc()或PyMem_Realloc()返回。

否则,或者之前调用了PyMem_Free(p),未定义

行为发生。如果p为NULL,则不执行任何操作。


但是你的结果不是由PyMem_Malloc分配的,而是由C返回给你的是
功能。


-

Antoon Pardon



Well assuming your doStuff is a C function that knows nothing of python.
it might be the PyMem_Free(result).
http://docs.python.org/api/memoryInterface.html says the following:

void PyMem_Free(void *p)
Frees the memory block pointed to by p, which must have been
returned by a previous call to PyMem_Malloc() or PyMem_Realloc().
Otherwise, or if PyMem_Free(p) has been called before, undefined
behavior occurs. If p is NULL, no operation is performed.

But your result wasn''t allocated by a PyMem_Malloc, it was returned
to you by a C function.

--
Antoon Pardon


这篇关于C包装函数,崩溃Python?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆