Jag har ett par frågor som jag hoppas att jag skulle kunna få svar på :)
1.
Vad händer om man använder operatorn 'delete' på en pekare som pekar på t.e.x det andra elementet i
en dynamisk vektor?
Exempel:
int *pi = new int[3];
pi[0] = 0;
pi[1] = 1;
pi[2] = 2;
pi++;
delete [] pi;
Är det odefinierat enligt ANSI/ISO-standarden, eller kvittar det vilket element 'pi' pekar på? "Försvinner" hela datablocket då?
2.
Varför skriver skriver följande slinga ut 'fisk nr..' 5 gånger? Enligt mig borde det endast ske 4 ggr
Som jag förstått det så ökar '++i' i med 1 och använder det nya värdet i uttrycket,
medan 'i++' använder värdet i har, och sedan ökar variablen med 1.
Jag förstår inte...
const int MAX = 5;
double fish[MAX];
cout << "Skriv in vikten på dina fiskar.\n";
cout << "Upp till " << MAX << " fiskar kan matas in, tecken avbryter\n";
cout << "fisk nr 1: ";
int i = 0;
while (i < MAX && cin >> fish[i])
{
// varför?
if (++i < MAX)
cout << "fisk nr " << i + 1 << ": ";
}
men i ditt exempel tar du bort hela vektorn så där funkar det.
Nej, eftersom han ändrar så att pi pekar på det andra elementet kommer programmet krascha på delete[]. Du kan endast använda delete[] på värdet som returneras från new[].
Ahhh, va dum jag är. Nu ser jag ju anledningen till att det skrivs ut 5 ggr. Får väl skylla på tillfälligt hjärnsläpp, eller nåt :)
Men alltså.. Om man vill använda 'delete' på en dynamisk vektor så ärdet alltså VÄLDIGT viktigt att hålla koll på adressen till det första elementet?
Låt oss säga att jag använder 'delete []' på värdet som returneras från new[1]. Umm.. blir det elementet, typ.. oinitierat då? Eller sabbar man hela vektorn?
Det är riktigt. Om du nu avser en sådan dynamiskt allokerad datastruktur som du har i ditt exempel. I det fallet är det bättre att bara tilldela 0 på den pos du vill radera och slutligen avallokera med delete när du tar bort arrayen, lämpligen i en destruktor för att släppa minnet.
Men om du menar att du t.ex har en std::vektor fullmatad med objekt som var och ett är skapat med new så måste du köra delete för varje position i std::vektorn för att släppa minnet.
260 ms totalt · 4 externa anrop · v20260731065814-full.6fe65c25