Avatar billede tokelil Nybegynder
27. september 2006 - 15:57 Der er 10 kommentarer og
1 løsning

DELETE macro

Det her er mere et sprøgsmål om god programmerings praksis etc.

Det regnes for god programmerings praksis altid at sætte sine pointers til 0, efter hukommelsen er blevet frigivet.
  delete p;
  p = NULL;

Er der nogen speciel grund til at "folk" ikke bruge en macro til det  i stedet? F.eks.:
  DELETE(p)
ville være det samme som ovenstående?

Det ville f.eks. betyde man var sikker på at programmet gik ned med en null pointer exception hvis man forsøger at delete p to gange. (Hvilket er at foretrække, frem for en korrupt heap IMO...)

Thoughts?
Avatar billede mollevp Nybegynder
27. september 2006 - 18:51 #1
Hvis du laver din macro korrekt kan jeg ikke se noget problem i det..

#define DELETE(p) do{ delete p; p = 0; }while(0);

Skulle vist kunne gøre det..
Avatar billede mollevp Nybegynder
27. september 2006 - 18:55 #2
Skal self. være:
#define DELETE(p) do{ delete p; p = 0}while(0)
Avatar billede mollevp Nybegynder
27. september 2006 - 18:56 #3
Om igen:
#define DELETE(p) do{ delete p; p = 0; }while(0)
Avatar billede tokelil Nybegynder
27. september 2006 - 19:09 #4
Nu er jeg ikke den store macro ekspert, men hvorfor har du det i en do...while løkke?
Avatar billede bertelbrander Novice
27. september 2006 - 19:51 #5
Jeg tror at det er fordi at man så kan skrive:

if(pop)
  DELETE(p);

Det kan man ikke uden.

Jeg kan ikke se noget problem i macro'en, men du kunne overveje at lave den som en template funktion.

Iøvrigt må man gerne delete en 0 pointer.
Avatar billede tokelil Nybegynder
27. september 2006 - 19:58 #6
Dit eksempel med at have kunne delete + sætte til 0, i en if sætning uden {} er en af grundene til jeg ville have en sådan macro.

"Iøvrigt må man gerne delete en 0 pointer."
True, havde jeg lige fortrængt da jeg skrev 1. indlæg.
Avatar billede mollevp Nybegynder
27. september 2006 - 22:18 #7
Jeg ville måske overveje om man ikke kunne bruge en eller anden auto_ptr istedet.. er det det du mener med template funktion Bertel?
Avatar billede bertelbrander Novice
27. september 2006 - 23:39 #8
Det var en funktion som denne jeg tænkte på:

template <typename T>
void Delete(T*& a)
{
  delete a;
  a = 0;
}

Man skal også huske at tage højde for at der både er delete og delete []
Avatar billede tokelil Nybegynder
21. november 2006 - 13:16 #9
Tak for "diskussionen". Jeg har valgt at bruge nogle simple macroer pt. Det er desværre ikke så godt for læsbarheden (manglende editor highlight), men er rart at kunne skrive f.eks.
if (str)
    DELETE_ARRAY(str);

I kan dele pointene hvis i smider et svar.
Avatar billede tokelil Nybegynder
14. december 2008 - 18:55 #10
Er der nogen der vil have point? Ellers lukker jeg emnet og tager dem selv om et par dage...
Tak for hjælpen.
Avatar billede tokelil Nybegynder
20. december 2008 - 22:35 #11
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