Hét vraag- en antwoordplatform van Nederland

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.

Verwijderde gebruiker
11 jaar geleden
906

Heb je meer informatie nodig om de vraag te beantwoorden? Reageer dan hier.

Het beste antwoord

Moeilijke vraag voor dit forum... Ik heb er wel even over moeten nadenken, ik denk dat ik de vraag begrepen heb. Tja, het lijkt inderdaad paradoxaal dat een const gedelete kan worden, maar zoals je zelf al zegt: je wijzigt niet het component zelf maar slechts de pointertabel. Het is natuurlijk ook een beetje inherent aan dynamisch gealloceerd geheugen dat het op enig moment wordt gedelete... Bij mijn weten kent C++ geen manier om dit tegen te gaan, en simpel de qualifier "const" gebruiken werkt dan natuurlijk niet. Ik denk dat je de oplossing moet zoeken in een andere manier van werken. Heb zelf heel vroeger geloof ik zoiets gedaan, de pointer doorgeven vanuit een statisch gealloceerd gebied of zo. Hm, ben benieuwd of iemand anders hier een beter antwoord op heeft.
(Lees meer...)
Verwijderde gebruiker
11 jaar geleden

Weet jij het beter..?

Het is niet mogelijk om je eigen vraag te beantwoorden Je mag slechts 1 keer antwoord geven op een vraag Je hebt vandaag al antwoorden gegeven. Morgen mag je opnieuw maximaal antwoorden geven.

0 / 2500
Gekozen afbeelding