2016-10-09 2 views
1

Es fiel mir auf, dass, wenn ich einen Teil des Speichers mit einem const Zeiger deklarieren, etwa so:Gibt es eine Kehrseite einen Zeiger für zugewiesenen Speicher zu deklarieren als const verwendet

SomeType * const pointer = malloc(sizeof *pointer); 

Ich kann nicht aus Versehen „verlieren "der Zeiger, (dh durch Ändern oder Überschreiben). Dies scheint eine bequeme "Erinnerung" zu sein, dass die Erinnerung, auf die sie verweist, befreit werden muss. Gibt es einen Nachteil, dies zu tun? Eine Anzahl von Dingen kommt in den Sinn, möglicherweise aufgrund des Zurückgebens des Zeigers von einer Funktion oder weil es möglicherweise mit einer großen Anzahl von Bibliotheksfunktionen inkompatibel ist. Diese scheinen jedoch eher Unannehmlichkeiten als ein tatsächlicher Fehler zu sein.

+0

Was meinen Sie mit "den Zeiger von einer Funktion zurückbringen"? Sie können eine Adresse aus einer Funktion zurückgeben, müssen diese aber einer Aufrufvariablen im Aufrufer zuordnen, die - wenn Sie das deklarieren - nach der Initialisierung nicht geändert werden kann. Was du schon bemerkt hast. Damit? – Olaf

+0

@Olaf Ich weiß es nicht, deshalb frage ich. Würde das Probleme verursachen? – Tibrogargan

+1

Wenn es const ist, können Sie die Größe nicht ändern mit 'realloc()' – Dmitri

Antwort

1

Ich verstehe es nicht. Sie können immer noch free vergessen.

Auf der anderen Seite Sie es nicht 0 einstellen können, nachdem Sie es frei, um anzuzeigen, dass es bereits freigegeben ist, so können Sie in Aufruf free zweimal (man denke an einige Fehlerbehandlung Code vorstellen, wo es passieren kann) riskieren.

EDIT: Zusätzlich wird, wie @Dmitri in den Kommentaren gesagt, erklärt den Zeiger const Sie es von Neuzuweisung verhindert (mit allen Mitteln).

+1

'frei (NULL)' tut nichts, Sie können es so oft freigeben, wie Sie möchten. – Tibrogargan

+3

@Tribrotargan: das ist genau mein Punkt. Aber du kannst nicht 'frei' (Zeiger); Zeiger = NULL; free (Zeiger); 'wenn es' const' deklariert wird. – ybungalobill

+0

Das Setzen eines lokalen Zeigers auf 'NULL' ist sowieso oft sinnlos. Und statische Zeiger auf dynamischen Speicher funktionieren sowieso nicht. – Olaf

Verwandte Themen