Ahoj, rad bych se zeptal tech kteri ovladaji C++.
Hlavni problem se tyka mazani pameti.
Zkusim trosku popsat situaci:
Mam zasobnik a do nej si vkladam stavy. Stav muze vygenerovat 2 sousedy. Zasobnik prochazim a nevhodne sousedy mazu a vhodne sousedy vkladam do zasobniku. Problem je v mazani stavu.
sousedy ziskam timto zpusobem - vytvorim si pole sousedu (ty jsou ted vzdy 2), pro kazdy pole zkopiruju aktualni stav a u jednoho ze stavu zmenim jednu hodnotu v matici na 0. Vytvorim si stavy a ty vratim.
http://paste-it.net/private/hbf4e62/
tak se mi stejne nejak nesmaze vse a stale narusta pamet az aplikace spadne. Pritom v zasobniku je vzdy +- max 20 stavu
prosim muzete poradit jak na tu pamet. .diky
Fórum › C / C++
C++ a mazani pameti
No, problém bude nejspíš v metodě State::getSuccessors(). Otázka, kde uvolňuješ paměť přidělenou operátorem new v této metodě? Z kódu který si ukázal to vypadá, že nikde, pokud se o to nestará jiná třída nebo metoda, která zde není vidět.
Nejlepším řešením by asi bylo použít boost::ptr_vector<Typ> místo std::vector<Typ*> - fungují stejným způsobem, oba ukládají ukazatele, ale boost::ptr_vector se stará i o správu paměti, to znamená, že když boost::ptr_vector přestane existovat, automaticky se dealokuje i paměť kterou na kterou ukazovali ukazatel v tomto ptr_vektoru uložené. Zde http://www.boost.org/doc/libs/1_42_0/libs/ptr_container/doc/tutorial.html je pár příkladů použití.
Pokud ti tohle řešení nevyhovuje, musíš si ujasnit kde, kdy a co smazat :)
To Palmik :
diky za odpoved
ja jsem prave myslel, ze tu pamet uvolnuju prave v destruktoru:
v getSuccessors si vytvorim nove stavy:
new State(newAdjacencies[i], this->depth+1, this->numberOfVertices*iToChange+jToChange);
tyto stavy po vytvoreni se matice ulozi do adjacency:
this->adjacency = adjacency;
a pak pri mazani stavu v destruktoru smazu tuto matici
State::~State() {
for(int i = 0; i < this->numberOfVertices; i ++){
delete this->adjacency->at(i);
}
delete this->adjacency;
}
to je spatny zpusob? Teda zjevne asi jo, protoze ta pamet narusta
Tak jsem to jak se zda vyresil... problem byl, ze sice jsem to predaval, ale kdyz nic nenasel, tak jsem predaval NULL a nemazala se pamet
if (successorFound){
newAdjacencies[0]->at(iToChange)->at(jToChange) = 0;
newAdjacencies[0]->at(jToChange)->at(iToChange) = 0;
for (int i=0; i<2; i++){
states[i] = new State(newAdjacencies[i], this->depth+1, this->numberOfVertices*iToChange+jToChange);
}
} else {
for(int adjacency_index = 0; adjacency_index < 2; adjacency_index++ ){
for(int i = 0; i < this->numberOfVertices; i++){
delete newAdjacencies[adjacency_index]->at(i);
}
}
delete newAdjacency;
delete [] states;
delete [] newAdjacencies;
states = NULL;
}
Nejspíš budeš tedy na dobré stopě. Ještě můžeš zkusit program prohnat Valgrindem http://valgrind.org/, který by ti měl hledání usnadnit.
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Mazaní komentářu — založil Jakub Kahoun
Mazani v retezci — založil pavel
Mazání tempů — založil dragon124
Mazání v editoru — založil liborb
Mazání v souboru — založil Filip0913
Moderátoři diskuze