PyRun_SimpleString调用导致内存损坏?

时间:2014-12-10 18:39:29

标签: python c++ embed

我正在尝试在C ++中使用Python并具有以下代码。我打算在用户输入路径上解析并执行sys.path.append。看起来对PyRun_SimpleString的调用导致某种类溢出到类的私有类var中。这怎么发生的?我尝试了各种缓冲区大小50,150,200,并没有改变输出。

class Myclass
{
    ...
    private:
        char *_modName;
        char *_modDir;
};
Myclass::Myclass()
{
    Py_Initialize();
    PyRun_SimpleString("import sys");
    PyRun_SimpleString((char *)"sys.path.append('/home/userA/Python')");
}
Myclass::init()
{
    // this function is called before Myclass::test()
    // a couple other python funcitons are called as listed below. 
    // PyString_FromString, PyImport_Import, PyObject_GetAttrString, PyTuple_New, PyTuple_SetItem, PyObject_CallObject, PyDict_GetItemString
}
Myclass::test()
{
    char buffer[150];
    char *strP1 = (char *)"sys.path.append('";
    char *strP2 = (char *)"')";
    strcpy (buffer, strP1);
    strcat (buffer, _modDir);
    strcat (buffer, strP2);
    printf("Before %s\n", _modDir);
    printf("Before %s\n", _modName);
    PyRun_SimpleString(buffer);
    printf("After %s\n", _modName);
} 

这是输出。仅供我使用a,b,c,d,f仅用于说明目的。它几乎像PyRun_SimpleString(缓冲区)一样填充缓冲区的末尾到_modName。

Before /aaa/bbb/ccc/ddd
Before ffffff
After cc/ddd'

1 个答案:

答案 0 :(得分:0)

感谢Klamer Schutte暗示正确的方向。 我的代码中的DECRF是罪魁祸首。我想,对于参考的工作原理并不敏感。 DECREF调用释放了pValue以及_modName指向的内容。如果我在_modName赋值后添加了一个Py_INCREF(pValue),那么猜测会有更多的初学者问题吗?

_modName = PyString_AsString (PyDict_GetItemString(pValue, (char*)"modName"));
Py_DECREF(pValue);