Oprettet søn. d. 03. januar 2010 kl. 21:45:45

mbm2007
mbm2007 (7.867 point. Point ude: 30)
www.magnusbm.dk

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

Skrevet søn. d. 03. januar 2010 kl. 21:53:15| #1

kimsey0
kimsey0 (23.194 point)
jacobbundgaard.dk
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?

Skrevet søn. d. 03. januar 2010 kl. 22:01:38| #2

arne_v
arne_v (1.005.658 point)
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)

Skrevet søn. d. 03. januar 2010 kl. 22:02:02| #3

arne_v
arne_v (1.005.658 point)
re 3)

Overvej hvad der sker hvis typen er noder i en dobbelt linket liste !!

Skrevet søn. d. 03. januar 2010 kl. 22:19:29| #4

arne_v
arne_v (1.005.658 point)
Problemet med pointere er (som jeg forklarede i sidste tråd) at copy constructor / assignment operator ikke bliver kaldt.

Skrevet man. d. 04. januar 2010 kl. 17:14:24| #5

mbm2007
mbm2007 (7.867 point)
www.magnusbm.dk
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/ (...)

Skrevet man. d. 04. januar 2010 kl. 17:24:22| #6

arne_v
arne_v (1.005.658 point)
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.

Skrevet man. d. 04. januar 2010 kl. 17:31:04| #7

mbm2007
mbm2007 (7.867 point)
www.magnusbm.dk
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 :)

Skrevet man. d. 04. januar 2010 kl. 18:07:02| #8


Skrevet man. d. 04. januar 2010 kl. 19:37:43| #9

mbm2007
mbm2007 (7.867 point)
www.magnusbm.dk
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?

Skrevet man. d. 04. januar 2010 kl. 20:01:20| #10

arne_v
arne_v (1.005.658 point)
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.

Skrevet lør. d. 30. januar 2010 kl. 23:48:56| #11

arne_v
arne_v (1.005.658 point)
Tid at faa afsluttet her?

Skrevet søn. d. 31. januar 2010 kl. 16:24:47| #12

mbm2007
mbm2007 (7.867 point)
www.magnusbm.dk
yes jeg giver point arne

Skrevet søn. d. 31. januar 2010 kl. 17:03:48| #13


Skriv et indlæg




Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] [img]link til billede[/img]
Web- og emailadresser omdannes automatisk til links

Log ind

   

   

Seneste spørgsmål

Regex sætning i C++

Oprettet den 30. januar 2012 kl. 22.55
kjeldsted giver 150 point for svar | Giv et svar »

Bog om strukturering

Oprettet den 25. januar 2012 kl. 07.26
keepy giver 30 point for svar | Giv et svar »

Opsnap keypress globalt.

Oprettet den 24. januar 2012 kl. 16.14
xited giver 200 point for svar | Giv et svar »

Seneste guides

Installer win 7
Den gode bruger


   




Tips & Tricks fra PC World

Teaser billede

Her er fem sjove danske websider du skal kende

Trænger dine lattermuskler til en omgang fitness på dansk? Vi viser vej til fem websider fyldt med humor og vanvittig satire.


Anmeldelser fra PC World

Teaser billede

Test: Denne super-tablet er iPads hårdeste konkurrent

Eee Pad Transformer Prime er frygtindgydende med sin quadcore processor og evne til at trylle sig om til bærbar. Apple bør kigge i bagspejlet, for Asus' tablet-pc kommer buldrende - og gør det...


Seneste blogindlæg

Teaser billede

Tvangslukke spørgsmål: Hvad er den bedste løsning?

Hej Vi har mange åbne spørgsmål på Eksperten. Vi ville gerne tvangslukke dem - så et spørgsmål efter f.eks. 6 måneder lukkes. Men der er et par uklarheder som ville være gode at få lidt input til:...


Nyheder fra PC World

Teaser billede

Nu kan du snart hente Windows 8

Den nye offentlige betaversion af Windows 8 er klar i denne måned.


Nyheder fra Computerworld

Teaser billede

Måske snart slut med Androids helt store problem

Android-platformen har længe været plaget af et særligt problem. Men måske er problemet nu ved at være elimineret.


Kurser
Samarbejdspartnere

Udgiver · © 2012 IDG Danmark A/S · Hørkær 18 · 2730 Herlev · Tlf.: 77 300 300 · Fax: 77 300 301 · Brug af personoplysninger