In C++, hoe kan een pointer constant worden doorgegeven?
Beschouw de volgende code:
===
void f (const int * const& p) {
delete p;
}
int main () {
const int n (1);
const int * const p (&n);
f (p); // run-time error door delete op statische gealloceerd geheugen.
const int * const q (new int (2));
f(q); // OK, delete overtreedt geen const regel en bevrijdt het dynamische gealloceerd geheugen.
return 0;
}
===
Doordat delete is toegestaan op een (const int * const) verliest const enigszins de semantische betekenis in dergelijke context.
Reden voor deze schijnbare paradox is dat met delete alleen alleen wijzigingen worden aangebracht in de pointer table en niet in de const gekwalificeerde componenten.
Immers, (const int) wordt niet overtreden, omdat er geen wijziging wordt aangebracht in de integer en (* const) wordt niet overtreden, daar de pointer zelf niet wordt gewijzigd.
Mijn vraag is nu of C++ low-level manieren kent om dynamisch gealloceerd geheugen te beschermen tegen delete. Pointers wrappen in structs en classes is altijd goed als fascade naar de gebruiker,
maar in sommige gevallen is het ook belangrijk om class-internals tegen elkaar te beschermen.
Heb je meer informatie nodig om de vraag te beantwoorden? Reageer dan hier.