Ist es sicher zu verwerfen volatile?

8

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

benutze
  

lö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

    
Cheok Yan Cheng 19.03.2010, 03:11
quelle

4 Antworten

4

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.

    
Richard Pennington 19.03.2010, 03:17
quelle
3

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; .

    
Potatoswatter 19.03.2010 03:27
quelle
2

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.

    
zneak 19.03.2010 03:26
quelle
0

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?

    
Carl Norum 19.03.2010 03:20
quelle

Tags und Links