Frage

volatile scheint eine nie endende Frage von jedem zu sein. Ich dachte, ich wüsste alles darüber, aber dann traf ich darauf:

Ich habe also ein Stück Erinnerung, das zwischen Threads geteilt wurde, und ich habe es so definiert:

volatile type *name;

Wenn Sie sich besser fühlen, können Sie sich vorstellen type ist nur ein int.

Dies bedeutet, dass ich einen Zeiger (der nicht flüchtig ist) auf einige volatile Daten. Zum Beispiel kann der Compiler beispielsweise den Wert von zwischenspeichern name aber nicht name[0]. Habe ich recht?

Also bin ich jetzt bin ich vfreeDieser Zeiger (er ist in einem Linux -Kernel -Modul) und er sagt mir das vfree erwartet const void * Während ich es bestehe volatile type *.

Ich verstehe, wie es gefährlich sein kann, a zu bestehen volatile type * Als ein type * Weil in dieser Funktion die Werte von name[i] könnte zwischengespeichert werden (als Folge der Optimierung), was nicht wünschenswert ist.

Ich verstehe aber nicht warum, vfree Erwartet, dass ich es notwendigerweise einen Zeiger an nichtflüchtige Daten sende. Fehlt mir etwas dort? Oder sind es nur die Jungs, die geschrieben haben vfree Nicht über diese Situation denken?

Ich nehme an, ich habe einfach meinen Zeiger auf die void * Würde keinen Schaden anrichten, stimmt das?

War es hilfreich?

Lösung 2

Meine Schlussfolgerung war, dass nur der Zeiger auf void * würde kein Problem und die Tatsache verursachen, dass free und vfree Akzeptieren Sie keine direkten Zeiger auf volatile Daten sind nur etwas, das übersehen wurde.

Andere Tipps

Das vfree Funktion (und jede vernünftige Deallocationsfunktion im Allgemeinen) kümmert sich nicht um Ihre tatsächlichen Daten (sei es volatile oder nicht). Es erwartet nur einen (gültigen) Zeiger (denken Sie: Überlegen Sie den Zeiger als long Wert in einem CPU -Register).

Basierend auf diesem Wert wird die Funktion:

  1. Rufen Sie die Platte/den Slub an, um den Speicher zu befreien
  2. Entfernen Sie die Speicherzuordnung

Also ja, zu einem keuchten void * wird zur Laufzeit keinen Schaden zufügen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top