Avatar billede neuro Nybegynder
31. oktober 2001 - 10:15 Der er 14 kommentarer og
3 løsninger

ikke flere NEW end DELETE

jeg har en funktion hvor jeg returnerer noget som bliver oprettet med new. hvordan kan jeg sørge for at dette bliver slettet fra hukommelsen igen, når jeg har returneret det?

->>> SOURCODE <<<-
string *substring(int startpos, int endpos) {

char *tmp;
           
tmp=(char *)malloc((endpos-startpos)+1);
strncpy(tmp,str_buffer+startpos,endpos-startpos);
tmp[(endpos-startpos)]=NULL;

string *t=NULL;
t=new string(tmp);
           
free(tmp);
           
return t;
           
}
->>> SOURCODE <<<-

når jeg bruger return ryger jeg jo ud af min funktion igen, og har dermed ingen mulighed for at bruge delete. nogen forslag til hvad man skal gøre i sådan en situation?
Avatar billede fri-hash Nybegynder
31. oktober 2001 - 10:19 #1
gør t til global variabel
Avatar billede jpk Nybegynder
31. oktober 2001 - 10:33 #2
Lav en manager som du kan kalde når du har brug for memory. Denne skal så sørge for at frigive hukommelsen igen, enten ved explicit kald eller ved programslut.
Avatar billede wisen Nybegynder
31. oktober 2001 - 10:40 #3
Du burde da godt kunne kalde delete på resultatet, når du er kommet tilbage fra funktionen. Det er jo en stringpointer....
Avatar billede jpk Nybegynder
31. oktober 2001 - 10:51 #4
Selvfølgelig kan man det, mit forslag, med at bruge en manager, er for at holde styr på hukommelsen, så der ikke opstår tvivl om hvornår hukommelsen skal frigives/hvor ansvaret ligger...
Avatar billede wisen Nybegynder
31. oktober 2001 - 10:52 #5
jpk >> Ja, det har du ret i, men det er også en del sværere....
Avatar billede jpk Nybegynder
31. oktober 2001 - 10:58 #6
=> wisen
Du har ganske ret, der er selvfølgelig mere arbejde ved denne metode...
Det kan selvfølgelig heller ikke betale, hvis det kun er dette ene tilfælde!
Avatar billede neuro Nybegynder
31. oktober 2001 - 11:13 #7
jegk an desværre ikke bare delete t , når jeg er kommet ud af min funktion ..

t undeclared identifier.

men det ser således ud når jeg bruger min substring funktion.

string *b;
b=a.substring(0,8);

så det er måske bare b jeg skal delete ?

Avatar billede neuro Nybegynder
31. oktober 2001 - 11:16 #8
ideen med en manager er god, men tror det vil være lidt for voldsomt i dette tilfælde. =) det er jo bare et simpelt string objekt.
Avatar billede jpk Nybegynder
31. oktober 2001 - 11:27 #9
Du skal naturligvis kalde din funktion på denne måde:

string* pStr = substring(startpos, endpos);

delete pStr;
Avatar billede wisen Nybegynder
31. oktober 2001 - 11:31 #10
Nej, det er rigtigt at det ikke skal være delete t, men som jpk skriver, selvfølgeligt være den variabel du ligger resultatet af funktionen i...
Avatar billede neuro Nybegynder
31. oktober 2001 - 11:58 #11
ok, så det skulle være ok hvis jeg bare kalder delete b; ???
Avatar billede jpk Nybegynder
31. oktober 2001 - 12:00 #12
jep...
Avatar billede jpk Nybegynder
31. oktober 2001 - 12:00 #13
b er jo en pointer til det memory der er allokeret!
Avatar billede neuro Nybegynder
31. oktober 2001 - 12:02 #14
men problemet er at hvis jeg kalder delete b; går programmet ned.

\"memory could not be written\"
Avatar billede soepro Nybegynder
01. november 2001 - 10:12 #15
string BuildString(char *s)
{
  string* temp = new string(s);
  return temp;
}

int main(void)
{
  char*  cStr = \"Dette er en normal char string\";
  string* pStr = NULL;
 
  pStr = BuildString(cStr);

  // En masse kode der bruger den dannede string til noget
  :
 
  // Oprydning
  if (pStr != NULL)
    delete pStr;

  return;
}
Avatar billede soepro Nybegynder
01. november 2001 - 10:13 #16
(Kræver jo nok en #include <cstring.h> eller noget i den stil i toppen, men det har du jo nok styr på allerede.)
Avatar billede neuro Nybegynder
01. november 2001 - 12:04 #17
jeg har selv løst problemet ved at lave min substring funktion, så den ikke returnerer en pointer, men i stedet returnerer et nyt objekt af typen string.

tak for de gode input.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester