Delete de listes crées par l'allocation du compilateur
Bonjour;:ccool:
J'essai de cleaner un programme que je réutilise
Fait par deux entreprises Une CMM4 l'autre CMM5.
Cependant je trouve des scories que je ne résoud pas.
Quand je passe dans le destructeur, le compilateur génère le code de destruction des objets déclarés au niveau de l'objet sur lequel pointe le destructeur.
Je met l'exemple du code initial à disposition pour comprendre: voila la partie Déclaration de l'objet. Il y a donc deux listes de crée et le compilateur à l'appel du destructeur va générer un code qui détruira les listes. et il se plante dans la detruction de la deuxième liste
Code:
1 2 3 4 5 6 7 8 9 10
| class CNgramer
{
private:
enum enCNramerMethod
{
SEARCH_NGRAMS =1,
DELETE_NGRAMS,
};
std::list<std::wstring> wsListTrim1;
std::list<std::wstring> wsListTrim2; |
Je précise que j'ai supprimé l'appel du programme pour ce test et qu'on est dans un cycle constructeur destructeur sans autre code appelé et donc on peut juger que les données n'ont pas été perverties par d'autres codes.
J'ai donc codé un destructeur qui détruit explicitement les deux listes et ce code qui marche parfaitement sur la première se plante comme la précédente sur la deuxième
il y a sept termes dans la 1° liste et deux dans la deuxième liste
voici le code du destructeur
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| CNgramer::~CNgramer()
{
std::list<std::wstring>::iterator it;
it = wsListTrim1.begin();
while( it != wsListTrim1.end())
{
std::wstring *pStr;
pStr = &(std::wstring)*it;
delete pStr;
it++;
}
delete &wsListTrim1;
it = wsListTrim2.begin();
while( it != wsListTrim2.end())
{
std::wstring *pStr;
pStr = &(std::wstring)*it;
delete pStr;
it++;
}
wsListTrim2.clear();
delete &wsListTrim2;
} |
Puis je déduire que la destruction réussie des données de la deuxième liste exclue une perversion dans ces données ou dois-je chercher dans cette direction?:?
Destructeur de liste qui marche
Bonjour;
comme souvent en formulant une discussion j'ai fait des essais pour trouver une solution. J'ai donc déplacé le delete dans le constructeur après utilisation des données et crée les données par un new qui donne une donnée alloué dans la pile (apparemment bien mieux tolérée par le compilateur).:lol:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
| CNgramer::CNgramer()
{
CPOS* pPos;
std::list<std::wstring> *wsListTrim1;
std::list<std::wstring> *wsListTrim2;
std::list<std::wstring>::iterator itStringPos;
pPos = new CPOS();
m_bOptionProblem = false;
wsListTrim1 = new std::list<std::wstring>;
wsListTrim2 = new std::list<std::wstring>;
COption::GetShortValue(OPTION_SECTION_CNGRAMER, OPTION_KEYNAME_MIN_NGRAM_DEGREE, m_shMinNgramDegreeOM, &m_shMinNgramDegreeOM);
COption::GetShortValue(OPTION_SECTION_CNGRAMER, OPTION_KEYNAME_MAX_NGRAM_DEGREE, m_shMaxNgramDegreeOM, &m_shMaxNgramDegreeOM);
COption::GetShortValue(OPTION_SECTION_CNGRAMER, OPTION_KEYNAME_MIN_PERCENTAGE, m_shMinPercentageOM, &m_shMinPercentageOM);
COption::GetShortValue(OPTION_SECTION_CNGRAMER, OPTION_KEYNAME_MIN_OCCURENCE, m_shMinOccOM, &m_shMinOccOM);
COption::GetStringList((std::wstring)OPTION_SECTION_CNGRAMER,(std::wstring)OPTION_KEYNAME_LIST_TRIM1 , *wsListTrim1, wsListTrim1);
COption::GetStringList((std::wstring)OPTION_SECTION_CNGRAMER,(std::wstring)OPTION_KEYNAME_LIST_TRIM2 , *wsListTrim2, wsListTrim2);
if(m_bOptionProblem == false)
{
itStringPos = wsListTrim1->begin();
while (itStringPos != wsListTrim1->end())
{
enPOS Curpos = pPos->CPOS::GetPOSWithPOSLabel(*itStringPos);
m_ListTrim1.push_back(Curpos);
itStringPos++;
}
itStringPos = wsListTrim2->begin();
while (itStringPos != wsListTrim2->end())
{
m_ListTrim2.push_back(pPos->CPOS::GetPOSWithPOSLabel(*itStringPos));
itStringPos++;
}
}
std::list<std::wstring>::iterator it;
it = wsListTrim1->begin();
while( it != wsListTrim1->end())
{
std::wstring *pStr;
pStr = &(std::wstring)*it;
delete pStr;
it++;
}
delete wsListTrim1;
it = wsListTrim2->begin();
while( it != wsListTrim2->end())
{
std::wstring *pStr;
pStr = &(std::wstring)*it;
delete pStr;
it++;
}
delete wsListTrim2;
delete pPos;
} |
Destruction des éléments constitué par new
Bonjour et merci:D
Je reçois tes avis et te confirme que ce que tu dis est juste, mais je maintien que BCB est très sensibles aux allocations et supporte mieux les new suivie de delete que les objets générés dans la pile et qu'on a un meilleur résultat
- sur les objets listes en les allouant par un new et en les détruisant après l'utilisation
- sur les std::wstring en les déclarant dans une variable globale( sic...!)
à bientôt et toujours merci à vous, c'est utile d'avoir des gens réactifs lorsqu'on est en butte à des problèmes.:ccool:
à+ :lol: