webForumDet fria alternativet

Returnerar en kvardröjande pekare

C/C++

3 svar · 219 visningar · startad av MMXoaq

Medlem sedan apr. 200228 inlägg
Frågan#1

Hej jag har ett Problem det är såhär att jag ha skapat ett program med klasser nästlade i flera steg. MEn nu komemr problemet att från en funktion i klassen returnerar jag en pekare som ej finns kvar efteråt. Hur skall jag komma runt detta (alltså en kvardröjande pekare) ???

Medlem sedan juni 20022 599 inlägg
#2

Tja .. Genom att se till att det den pekar på inte går ur scope eller deletas? Har du nån kod?

Medlem sedan apr. 200228 inlägg
#3

Den deletas

Men jag tror att jag har löst det, bytte ut en hel del stoff och fick över hela skiten till referenser. Men tack iallafall

Medlem sedan juni 200010 432 inlägg
#4

Re: Returnerar en kvardröjande pekare

MMXoaq skrev:

Hej jag har ett Problem det är såhär att jag ha skapat ett program med klasser nästlade i flera steg. MEn nu komemr problemet att från en funktion i klassen returnerar jag en pekare som ej finns kvar efteråt. Hur skall jag komma runt detta (alltså en kvardröjande pekare) ???

Då lokala pekare/variabler som skapats i en funktion/metod endast lever i den funktionens/metodens adressrymd och "dör" (blir vad som helst) då man går ur funktionen/metoden finns det bara två saker att göra - använd heapen (allokera minne) eller gör om designen till att funktionen/metoden använder en redan definierad pekare i sin argumentlista:

//princip 1:
int *foo(void) {
    int *p;
    p = (int*)malloc(sizeof(int); //eller "new int" vid c++
    return p;
}

//princip 2:
void foo(int *p) {
    ...
    //bearbeta "p"
 }

Vid användade av heapen måste man destruera efteråt så vid enkla operationer på pekare är det mer fördelaktigt att köra med princip 2 ;)

Även om du kör med referenser så är principerna detsamma. Risken finns att det ändå fungerar - tillfälligt - men senare ballar ur och ger det ena märkliga felet efter det andra. Så ska du returnera en pekare måste du allokera för den eller använda en redan definierad sådan.

438 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
307 ms — deklarationer (db)
0 ms — hämta statistik (cache)
125 ms — hämta tråd, inlägg och bilagor (db)
307 ms — ändringar (db)