Avatar billede conrad Nybegynder
07. november 2003 - 19:24 Der er 20 kommentarer og
1 løsning

brug af delete

Jeg har følgende situation
//denne funktion kaldes mange gange
void functiona(Obj o)
{
  int a[o.array.lenght()];
  for(........)
  {
    kopier elementer fra o.array til a
  }
  kald en funktion med a
  function2(a)


}

function2(int a[], int l)
{
int b[len]
for(.....)
{
  kopier fra a til b
}
}

Håber i kan forstå situationen. Mit spørgsmål er ->

1) Giver det et memoryleak da a jo ikke bliver deleted
2) Hvis det gør skal jeg så blot kalde delete a[]?
Avatar billede arne_v Ekspert
07. november 2003 - 19:27 #1
1)

Nej - a allokeres på heap og deallokeres derfor pænt ved return.

2)

Det skal du ikke - kun delete ved new.
Avatar billede arne_v Ekspert
07. november 2003 - 19:29 #2
I funktion2 kan du overveje memcpy til hurtig kopiering.
Avatar billede conrad Nybegynder
07. november 2003 - 19:32 #3
arne> kan der kun være memory leak såfremt jeg har benyttet new ...so,ething og ikke benytte delete ...something?
Avatar billede arne_v Ekspert
07. november 2003 - 19:35 #4
Hvis vi ser bort fra obskuriteter såsom rekursive kald der ikke
returnerer som de skal, så kræver en memory leak dynamisk allokering
uden matchende deallokering.

I C++ er det meget typisk new uden delete. Man kan dog også i C++ bruge
C funktionerne malloc og free.
Avatar billede conrad Nybegynder
07. november 2003 - 19:38 #5
hmm, nu kommer der et langt ude spørgsmål:

Har du nogen ide til hvad der kan få et program til at gå ned efter alt mellem 3-15 minutter? Jeg sidder med en fejl jeg simpelt hen ikke kan finde
Avatar billede conrad Nybegynder
07. november 2003 - 19:43 #6
og hvor mange new uden tilhørende delete skal der til før det bliver et problem? Blot 1?
Avatar billede arne_v Ekspert
07. november 2003 - 19:48 #7
En memory leak er bare en memory leak d.v.s. at hvis du leaker 1000 bytes
per gang så kan du gøre det "antal fri memory i din PC"/1000 gange.
Avatar billede arne_v Ekspert
07. november 2003 - 19:49 #8
Du kan nemt detecte en memory leak. Du studerer bare hvordan memory
forbruget udvikler sig. Task Manager i windows. Hvis memory forbruget
vokser konstant indtil det nærmer sig total memory så er det en leak.
Avatar billede arne_v Ekspert
07. november 2003 - 19:50 #9
Fejl kan også skyldes andre ting. F.eks. noget der løber ud over
en array graænse og laver en overskrivning af noget memory.
Avatar billede conrad Nybegynder
07. november 2003 - 19:59 #10
Jeg lukker her, tak for din hjælp arne. Er du "til at få fat på" her i aften?
Avatar billede arne_v Ekspert
07. november 2003 - 20:06 #11
Ja.
Avatar billede jpk Nybegynder
10. november 2003 - 08:45 #12
arne_v >> du mener selvfølgelig a allokeres på stack'en, ikke heap'en...

conrad >> er der nogen speciel årsag til at du kopierer alt indholdet?
Det er jo netop kun lokalt for funktionerne, så jeg forstår ikke helt hvad du får ud af det..?
Avatar billede arne_v Ekspert
10. november 2003 - 08:49 #13
Ja selvfølgelig. Sorry.
Avatar billede conrad Nybegynder
10. november 2003 - 09:11 #14
Obj indeholder et array. Et nyt objekt af en anden type skal oprettes med en kopi af dette array. Det var lidt hurtigt skrevet eksempel- function2 er min constructor
Avatar billede conrad Nybegynder
10. november 2003 - 09:16 #15
er der en af jer der vil svare på om følgende er en legal måde at delete på:

map<int,SomeObject*> it;

if(it == mymap.end())
{
  delete mymap[id];
  mymap.erase(id)
}

Jeg kan evt åbne et nyt spørgsmål
Avatar billede jpk Nybegynder
10. november 2003 - 09:18 #16
Jamen det vil jo ikke virke da array'et i function2 er lokalt!
Når funktionen/konstruktøren er udført, er b ikke længere i memory...
Avatar billede conrad Nybegynder
10. november 2003 - 09:24 #17
jpk>> Jeg kan godt se det ikke er helt smart den eksempel kode jeg har fåt skrevet. Den rigtige kode, som svarer til function2 ser således ud:

ACKData::ACKData(int aid,nsaddr_t r[],int rl, Time sat)
{
    this->ackid = aid;//id of this ACK
    this->route_l = rl;//lenght of array
  //do some copying here
    for(int i = 0; i < rl; i++)
    {
      this->route.push_front(r[i]);
    }
    this->sendat=sat;//time we send this ACK
}

den er der vel ikke noget galt med?
Avatar billede jpk Nybegynder
10. november 2003 - 10:20 #18
Hvilken type er route?
Avatar billede conrad Nybegynder
10. november 2003 - 10:25 #19
STL list
Avatar billede jpk Nybegynder
10. november 2003 - 10:35 #20
Hvoefor gemmer du så størrelsen på array'et i route_l?
list har jo en size() metode...
Avatar billede conrad Nybegynder
10. november 2003 - 12:45 #21
Jeg tror jeg startede med at have et array, hvor jeg blev nødt til at gemme længden. Senere har jeg skiftet til list og så er det da rigtigt at det er unødvendigt.
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