Som besökare på Hamsterpaj samtycker du till användandet av s.k. cookies för att förbättra din upplevelse hos oss. Jag förstår, ta bort denna ruta!
Annons

C++ frigör jag allt minne nu?

Skapad av Borttagen, 2011-01-13 21:35 i Webbutveckling & Programmering

1 270
6 inlägg
0 poäng
detvanliga
Visningsbild
Hjälte 381 inlägg
0
Har en vector:

Ett stycke C#-kod:

std::vector< OBJECT* > objects;


Skickar den sedan som parameter till denna funktion:

Ett stycke C#-kod:

void clear_objects( std::vector< OBJECT* > *objects )
{
while( !objects->empty() )
{
delete ( *objects )[ (size_t)0 ];
objects->erase( objects->begin() );
}
objects->clear();
}


Detta är bara en snabb model av hur det ser ut. Måste göra det på dethär sättet.

Dealokerar jag allt minne som finns i vectorn nu? Eller är det en minnes läcka? Vill bara vara säker då det är riktigt mycket minne det handlar om.

Ingen status

Är reklamen ivägen? Logga in eller registrera dig så försvinner den!

cower
Visningsbild
P 44 Lund Hjälte 1 042 inlägg
0
Svar till detvanliga [Gå till post]:
Det där blir inte bra. Du bör inte använda erase() på vector, den är långsam, och dessutom så gör clear() samma sak som att göra erase() på alla objekten, fast mycket snabbare.

Du vill ha nåt i den här stilen:
Ett stycke C#-kod:
template <T> void clear_vector(std::vector<T*>& objs) {
std::vector<T*>::iterator i;
for (i = objs.begin(); i != objs.end(); i++)
delete *i;
objs.clear();
}

// Alternativt:
template <T> void del(T* obj) {
delete obj;
}

template <T> void clear_vector(std::vector<T*> &objs) {
for_each(objs.begin(), objs.end(), del);
objs.clear();
}

// Om man är allergisk mot templates så kan man ju såklart göra:
void clear_vector(std::vector<OBJECT*>& objs) {
std::vector<OBJECT*>::iterator i;
for (i = objs.begin(); i != objs.end(); i++)
delete *i;
objs.clear();
}

Om du inte tycker om att använda &-argument så går det bra med en pekare istället.

(Att ha radbrytning före { hör till en kodstandard för C som heter Kernighan & Ritchie, och brukar inte användas för C++.)

Iofs så gör din funktion det du vill, dvs avallokerar minnet (så länge OBJECT har en korrekt destruktor).
detvanliga
Visningsbild
Hjälte 381 inlägg
Trådskapare
0

Svar till cower [Gå till post]:
Okej, vet iof att .erase() tar bort elementet och därmed borde få hela vectorn tom, men brukar alltid dra en .clear() efter endå.. Fast det tar ju ett extra varv med processorn då också..

Men ville mest veta så att jag frigjorde allt minne, vilket det verkar som att jag gör? Har nämligen ett objekt "fileManager" jag använder för att ladda / spara mina banor med. Och då vill jag kunna ladda medans jag spelar och då måste jag ta bort allt i alla vectors innan jag matar in allt det nya.

Så när jag skapar ett game state så får denne en fileManager som jag den kan använda.

Ingen status

Peter_den_bra
Visningsbild
Hjälte 121 inlägg
0
Anledningen till att du inte vill använda erase i onödan är för att det inte ska bli ett hål i vectorn så måste alla element som kommer efter det borttagna elementet flyttas ett steg. Det innebär att använda erase i början av vectorn är mycket mer ineffektivare än använda det i slutet. Som cower säger så behöver du inte erase här.

Ska vi vara petiga så frigör inte clear och erase något minne i det här fallet eftersom den interna buffern som vectorn använder fortfarande är den samma. vector::capacity() ger den interna bufferns storlek. Detta är dock inget du behöver oroa dig för.

Det är inte fel att ha fel.

detvanliga
Visningsbild
Hjälte 381 inlägg
Trådskapare
0

Svar till Peter_den_bra [Gå till post]:
"ka vi vara petiga så frigör inte clear och erase något minne"

Därför jag kör en delete jue ^^. Men det är sant att alla element måste flytta sej ett steg ja.. Tänkte inte på det faktiskt. Men förstår inte varför du tog upp capacity, men hursomhelst tack för att du påpekade!

Ingen status

cower
Visningsbild
P 44 Lund Hjälte 1 042 inlägg
0
Svar till detvanliga [Gå till post]:
Jag tyckte snarare du skulle ta bort erase() och bara ha en clear(). Sen måste du ju i så fall iterera på normalt sätt istället, varianten du använder funkar ju inte utan erase-anropet.

Notera dock att din iterering bör ta kvadratisk tid, närmare bestämt om du har N element i vektorn så tar det N/2 ggr så lång tid att iterera igenom den med din metod som med den normala. Det spelar liten roll om du har få men stora element i vektorn, stor roll om det är många små.


Forum » Datorer & IT » Webbutveckling & Programmering » C++ frigör jag allt minne nu?

Ansvariga ordningsvakter:

Användare som läser i den här tråden just nu

1 utloggad

Skriv ett nytt inlägg

Hej! Innan du skriver om ett potentiellt problem så vill vi påminna dig om att du faktiskt inte är ensam. Du är inte onormal och världen kommer inte att gå under, vi lovar! Så slappna av och gilla livet i några minuter - känns det fortfarande hemskt? Skriv gärna ner dina tankar och frågor, vi älskar att hjälpa just dig!

Den här tråden är äldre än Rojks drömtjej!

Det senaste inlägget i den här tråden skrevs för över tre månader sedan. Är du säker på att du vill återuppliva diskussionen? Har du något vettigt att tillföra eller passar din fråga i en ny tråd? Onödiga återupplivningar kommer att låsas så tänk efter en extra gång!

Hjälp

Det här är en hjälpruta

Här får du korta tips och förklaringar om forumet. Välj kapitel i rullningslisten här ovanför.

Rutan uppdateras automagiskt

När du använder funktioner i forumet så visas bra tips här.


Annons
Annons
Annons
Annons