Meistens mache ich diesen Weg.
%Vor%Allerdings habe ich hier einen Artikel gesehen:
Das Wegwerfen von flüchtigen Objekten ermöglicht den Zugriff auf ein Objekt durch einen nichtflüchtigen Referenz. Dies kann dazu führen undefiniert und vielleicht unbeabsichtigt Programmverhalten.
Was ist also der Workaround für mein Beispielcode?
Hier ist die Fehlermeldung, die ich bekomme, wenn ich
benutzelösche j
Beachten Sie, dass dies von VC6 ausgegeben wird (Fragen Sie nicht, warum ich VC6 verwende!)
c: \ Projekte \ a \ a.cpp (5): Fehler C2664: 'Löschen': Parameter 1 kann nicht konvertiert werden von 'volatile int *' zu 'void *' Conversion verliert Qualifier
Nichts. Wenn Sie nicht auf den flüchtigen Speicher zugreifen, ist die Semantik des flüchtigen Speichers nicht betroffen. Wenn Sie über einen nichtflüchtigen Zeiger auf flüchtigen Speicher zugegriffen haben, könnte der Compiler den Verweis optimieren. Wenn sich der Wert geändert hat, haben Sie den falschen Wert. Für einen Wert von falsch. ; -)
Das Löschen greift nicht auf den flüchtigen Speicher zu, es gibt es nur frei. Eine ungewöhnliche Sache, die mit flüchtigem Gedächtnis zu tun hat.
delete
ing a volatile
würde bedeuten, dass Sie den Zugriff darauf serialisiert haben, so dass es tatsächlich nicht mehr volatile
ist. Der richtige Weg, um die flüchtigen (wenn Sie wissen, dass es sicher ist) zu entfernen ist mit const_cast<int*>
.
Wenn der Zeiger und nicht int
flüchtig ist, dann hast du wirklich int *volatile j
gemeint. Wenn alle Mitglieder einer Klasse flüchtig sind, möchten Sie wahrscheinlich das gesamte Objekt gleichzeitig qualifizieren, a volatile aa;
.
Es hängt von der Bedeutung ab, die Sie von Ihrer volatilen Variablen erwarten. Momentan ist j
ein Zeiger auf eine volatile Ganzzahl; meinst Du das? Wenn dies der Fall ist, ist es sicher, da Sie nicht auf den flüchtigen Wert zugreifen müssen, sondern nur auf seine Adresse, die nicht flüchtig ist.
Wenn Sie jedoch meinen, dass Sie einen flüchtigen Zeiger auf eine ganze Zahl haben möchten, ist die erforderliche Syntax int* volatile j
. In diesem Fall könnte es problematisch sein, es zuerst in einen nicht- volatile
-Zeiger umzuwandeln, aber ich denke nicht, dass sich dein Compiler beschweren würde, wenn du versucht hast, delete
so zu machen, wie es ist. G ++, zum Beispiel, nicht.
Das sollte in Ordnung sein, da Sie nach dem Wegwerfen von volatile
nicht auf die Variable zugreifen. Ich weiß jedoch nicht, warum Sie trotzdem einen Fehler bekommen würden. Ich habe diesen Code selbst ausprobiert, und alles schien gut zu laufen, was hast du gesehen?
Tags und Links c++