當我運行此代碼時,我遇到了內存問題,所以我認爲我應該使用PY_DECREF()
來釋放內存,但我不知道該把它放在哪裏?任何幫助?我試圖把它放在代碼的末尾,在返回pArgs
之前,但它似乎不起作用。C++函數的引用計數
此代碼準備發送到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'。 – user4815162342
我知道我添加刪除tuplelist,但它似乎並沒有解決問題。我需要添加一些Py_DECREF肯定 – user3516044