Avatar billede mbm2016 Nybegynder
03. januar 2010 - 21:45 Der er 12 kommentarer og
1 løsning

C++ Realloc funktion - Er denne template funktion valid

Hej eksperter,

Jeg har nu søgt google tom for realloc funktioner, og har nu besluttet mig for at konstruere min egen.

Jeg har lavet den til en template funktion, så den er mere brugbar.

I funktionen allokerer jeg plads til den nye hukommelses blok, kopiere den gamle blok ind i den nye, og returnere start adressen til den nye hukommelses blok med den ønskede kapacitet.

Mit spørgsmål er såmend bare om dette er en gangbar løsning, dvs. kan den medføre memory leaks mv.?


template <typename AnyType>
AnyType * Realloc(AnyType * memblock, size_t old_size, size_t new_size)
{
  AnyType * temp = new AnyType[new_size];
  copy(memblock, memblock + old_size, temp);
  return temp;
}


På forhånd tak for hjælpen

/Magnus
Avatar billede Slettet bruger
03. januar 2010 - 21:53 #1
Nu er jeg ikke en haj til C++ programering, men glemmer du ikke at deallokere den tidligere brugte hukommelsesblok, eller et det meningen at koden "bare" kopierer variablen?
Avatar billede arne_v Ekspert
03. januar 2010 - 22:01 #2
1)  du skal selv deallokere det gamle mem som kimsey bemærker
2)  vi kender jo ikke copy så vi kan ike sige om den virker
3)  den virker nok med simple typer som int/double/char, men du får problemer med komplekse typer (med pointere)
Avatar billede arne_v Ekspert
03. januar 2010 - 22:02 #3
re 3)

Overvej hvad der sker hvis typen er noder i en dobbelt linket liste !!
Avatar billede arne_v Ekspert
03. januar 2010 - 22:19 #4
Problemet med pointere er (som jeg forklarede i sidste tråd) at copy constructor / assignment operator ikke bliver kaldt.
Avatar billede mbm2016 Nybegynder
04. januar 2010 - 17:14 #5
Det vil sige at jeg selv skal kalde copy constructor og assignment operator?

Hvis ja, hvordan gør jeg så dette?

Min kode ser nu således ud:

template <typename AnyType>
AnyType * Realloc(AnyType * memblock, size_t old_size, size_t new_size)
{
  AnyType * temp = new AnyType[new_size];
  copy(memblock, memblock + old_size, temp);
  delete[] memblock;
  return temp;
}

int main()
{
    int * hej = new int[2];
    hej[0] = 10;
    hej[1] = 20;

    hej = Realloc(hej,2,10);

    for(int i = 0;i<10;i++)
    hej[i] = (i+1) * 10;

    for(int i = 0;i<10;i++)
    cout << hej[i] << endl;

    return 0;
}


Jeg har testet den og den virker fint hos mig, det jeg ikke forstår er i siger at i ikke ved hvad copy gør, det er jo en helt almindelig c++ funktion: http://www.cplusplus.com/reference/algorithm/copy/
Avatar billede arne_v Ekspert
04. januar 2010 - 17:24 #6
Jeg kan ikke huske alle STL funktioner.

Men den bruger faktisk assignment og ikke memcpy/memmove - og saa bliver assignment operator kaldt for komplekse typer.

Saa skulle din kode vaere god nok.

Dit eksempel med int er ikke tilstraekkeligt til at teste, da int er en meget simpel type.
Avatar billede mbm2016 Nybegynder
04. januar 2010 - 17:31 #7
Kan du være sød at give mig et eksempel da min copy contructor erfaring/assignment operator erfaring ikke rækker tilstrækkeligt til at konstruere en valid model for testning af min kode

På forhånd tak :)
Avatar billede arne_v Ekspert
04. januar 2010 - 18:07 #8
Avatar billede mbm2016 Nybegynder
04. januar 2010 - 19:37 #9
Jo det kan jeg i princippet godt, men det der er mit problem er at jeg ikke ved hvilket ouput jeg skal forvente, altså hvad er korrekt/forkert.

Skal jeg bare lave et array af dine klasser og se om det virker eller hvad?
Avatar billede arne_v Ekspert
04. januar 2010 - 20:01 #10
Teknikken med at udskrive pointer naar man allokerer, bruger og deallokerer boer afsloere om du bruger en pointer som er deallokeret eller mangler at faa deallokeret noget.
Avatar billede arne_v Ekspert
30. januar 2010 - 23:48 #11
Tid at faa afsluttet her?
Avatar billede mbm2016 Nybegynder
31. januar 2010 - 16:24 #12
yes jeg giver point arne
Avatar billede arne_v Ekspert
31. januar 2010 - 17:03 #13
svar
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