C++ a mazani pameti – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

C++ a mazani pameti – C / C++ – Fórum – Programujte.comC++ a mazani pameti – C / C++ – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
Dawe
~ Anonymní uživatel
19 příspěvků
2. 5. 2010   #1
-
0
-

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

Nahlásit jako SPAM
IP: 89.176.233.–
Reklama
Reklama
Dawe
~ Anonymní uživatel
19 příspěvků
2. 5. 2010   #2
-
0
-

jeste matrix je definovana takto typedef std::vector< std::vector<int>* > matrix;

Nahlásit jako SPAM
IP: 89.176.233.–
Palmik0
Super člen
2. 5. 2010   #3
-
0
-

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 :)

Nahlásit jako SPAM
IP: 85.207.177.–
Yesterday is history. Tomorrow is a mystery. Today is a gift and that is why it's called the present.
Dawe
~ Anonymní uživatel
19 příspěvků
2. 5. 2010   #4
-
0
-

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

Nahlásit jako SPAM
IP: 89.176.233.–
Dawe
~ Anonymní uživatel
19 příspěvků
2. 5. 2010   #5
-
0
-

To Dawe :
ono to je v nejake pridavne knihovne asi vid?
ja prave muzu vyuzit jen tu standartni

Nahlásit jako SPAM
IP: 89.176.233.–
Dawe
~ Anonymní uživatel
19 příspěvků
2. 5. 2010   #6
-
0
-

To Dawe :
kdyz jsem to zkousel vymazat na konci funkce getSuccessors, tak mi to skonci s chybou (smazu to tomu novemu stavu)

Nahlásit jako SPAM
IP: 89.176.233.–
Dawe
~ Anonymní uživatel
19 příspěvků
2. 5. 2010   #7
-
0
-

http://semtex.wz.cz/memory.jpg

Nahlásit jako SPAM
IP: 89.176.233.–
Dawe
~ Anonymní uživatel
19 příspěvků
2. 5. 2010   #8
-
0
-

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;
}

Nahlásit jako SPAM
IP: 89.176.233.–
Dawe
~ Anonymní uživatel
19 příspěvků
2. 5. 2010   #9
-
0
-

tak ted to teda taky stoupa, ale na druhou stranu o dost mirneji.

Nahlásit jako SPAM
IP: 89.176.233.–
Palmik0
Super člen
2. 5. 2010   #10
-
0
-

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.

Nahlásit jako SPAM
IP: 85.207.177.–
Yesterday is history. Tomorrow is a mystery. Today is a gift and that is why it's called the present.
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 109 hostů

Podobná vlákna

Mazání v souboru — založil Filip0913

Mazani pomoci $get — založil tribalcz

Mazání cookies — založil kardon

C# - mazani slozek — založil ada.acs

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý