Op dinsdag 28 augustus 2001 01:17 schreef OiSyN het volgende:
...
Bijna perfecte uitleg, maar...
Dat je de array (dus niet de pointer) als pointer door kan geven naar functies enzo is simpelweg omdat je compiler 'm automatisch cast naar een pointer. Maar het IS geen pointer, daarom werkt de assignment ook niet
Niks geen impliciete cast... in allebei de gevallen alloceer je een
object op de stack, in het ene geval een pointer
naar interne data en in het andere geval een array
van interne data.
Sizeof geeft het formaat van het gealloceerde object terug, en zal hier dus inderdaad 2 verschillende resultaten geven. De
naam van een array is echter voor de compiler niets anders dan een pointer naar het begin van die array. Het is dus geen cast maar gewoon een simpele copy.
Dit puntje is gerelateerd aan het beroemde volgende geval:
code:
1
2
| char* Text = new char[50];
delete Text; |
Dit is een gevaarlijke operatie die niet door alle compilers goed uitgevoerd wordt!!!
De correcte versie is:
code:
1
2
| char* Text = new char[50];
delete [] Text; |
Sommige compilers zullen de eerste versie letterlijk interpreteren en alleen het
eerste object deleten. Dit betekent in dit geval een memoryleak van 49 chars. De 2e versie geeft (correct) de gealloceerde array vrij.
Borland's CodeGuard en andere code-checkers geven bij het op deze manier fout vrijgeven van arrays een flinke error.
* curry684 moest even mierenneuken, voor de rest perfecte uitleg
[addendum]
Ik zei:
De naam van een array is echter voor de compiler niets anders dan een pointer naar het begin van die array. Hier moet je natuurlijk wel bij bedenken dat deze pointer nergens wordt aangemaakt en alleen binnen de onderliggende assembler bestaat. Vandaar dat je er geen assignments op mag doen: hij bestaat in de C++ code niet fysiek.
[/addendum]
[edit2]Stommiteit gefixed