【发布时间】:2014-06-12 13:05:50
【问题描述】:
当我运行这段代码时,我的内存有问题,所以我想我应该使用PY_DECREF() 来释放内存,但我不知道把它放在哪里?有什么帮助吗?我试图将它放在代码的末尾,就在返回pArgs 之前,但它似乎不起作用。
此代码准备发送到 python 函数的参数,以便用计数列表填充pArgs。每个列表都是 python 函数的一个参数。
PyObject * Ecrire::getArgumentsbis(PythonRetour * pr){
int j = 0 ;
PyObject * pArgs = NULL;
int count=pr->numberargs;
pArgs = PyTuple_New(count);
PyObject * pValue;
PyObject ** tuplelist = new PyObject*[count];
for(j = 0; j < pr->numberargs; j++){
std::string argument = pr->nom_args[j];
int buffer = pr->buffer[j]+1;
tuplelist[j] = PyList_New(buffer);
if(ends_with_string(argument,"%#C#%"))
argument = argument.substr(0, argument.size()-5);
if(valeurs.size() >= buffer){
int l;
for(l = 0; l < buffer; l++){
map<std::string,pvalues>::const_iterator it = valeurs[valeurs.size() - 1 - l].find(argument);
if (it != valeurs[valeurs.size() - 1 - l].end()){
if(ends_with_string(pr->nom_args[j], "%#C#%")){
if((*it).second.type == "enumere"){
std::string valueread = (*it).second.val;
unsigned long long numberread;
istringstream(valueread) >> numberread;
std::map<std::string,inf_analyse>::const_iterator iter=mat->liste_analyse.find(argument);
if (iter != mat->liste_analyse.end()){
bool check = false;
std::string valuecorr = "";
int k = 0;
for(k=0;k<(*iter).second.nombre_valeurs;k++){
if((*iter).second.valeurs[k] == numberread) {
check = true;
valuecorr = (*iter).second.correspondances[k];
break;
}
}
if(check) {
pValue = PyString_FromString(valuecorr.c_str());
PyList_SetItem(tuplelist[j], buffer - l - 1, pValue);
}
else
return NULL;
}
}
}
else {
if((*it).second.type == "enumere"){
std::string valueread = (*it).second.val;
unsigned long long numberread;
istringstream(valueread) >> numberread;
pValue = PyInt_FromLong(numberread);
PyList_SetItem(tuplelist[j], buffer - l - 1, pValue);
}
else if((*it).second.type == "autre") {
std::string valueread = (*it).second.val;
double numberread;
istringstream(valueread) >> numberread;
pValue = Py_BuildValue("d", numberread);
PyList_SetItem(tuplelist[j], buffer - l - 1, pValue);
}
else if((*it).second.type == "chaine"){
std::string valueread = (*it).second.val;
pValue = PyString_FromString(valueread.c_str());
PyList_SetItem(tuplelist[j], buffer - l - 1, pValue);
}
}
}
else
return NULL;
}
}
else
return NULL;
PyTuple_SetItem(pArgs,j, tuplelist[j]);
}
return pArgs;
}
【问题讨论】:
-
在退出函数之前你肯定错过了
delete[] tuplelist。 -
我知道我添加了删除元组列表,但似乎并没有解决问题。我肯定需要添加一些 Py_DECREF
标签: python c++ cpython reference-counting