抛弃挥发物是否安全?

时间:2010-03-19 03:11:37

标签: c++

大多数时候,我都是这样做的。

class a {
public:
    ~ a() {
        i = 100;          // OK
        delete (int *)j;  // Compiler happy. But, is it safe?
                          // The following code will lead compilation error : delete j;
    }

private:
    volatile int i;
    volatile int *j;
};

int main() {
    a aa;

}

但是,我在这里看了一篇文章:

https://www.securecoding.cert.org/confluence/display/seccode/EXP32-C.+Do+not+access+a+volatile+object+through+a+non-volatile+reference

  

抛弃volatile允许访问   通过非易失性的对象   参考。这可能导致   未定义的,也许是无意的   程序行为。

那么,上面代码示例的解决方法是什么?

以下是我使用

时收到的错误消息
  

删除j

请注意,这是从VC6输出的(不要问我为什么使用VC6!)

  

c:\ projects \ a \ a.cpp(5):错误C2664:   '删除':无法转换参数1   从'volatile int *'到'void *'   转换失去限定符

4 个答案:

答案 0 :(得分:4)

无。如果不访问易失性存储器,则volatile的语义不受影响。如果通过转换的非易失性指针访问易失性存储器,编译器可能会优化引用。如果值已更改,则表示您的值不正确。对于一些错误的价值。 ; - )

删除不访问易失性内存,它只是释放它。与易失性内存有关的一种不常见的事情。

答案 1 :(得分:3)

delete volatile意味着您已对其进行序列化访问,因此实际上不再是volatile。删除volatile的正确方法(一旦你知道它是安全的)就是const_cast<int*>

如果指针而不是int是易失性的,那么你的意思是int *volatile j。此外,如果类的所有成员都是易变的,您可能希望立即限定整个对象a volatile aa;

答案 2 :(得分:2)

这取决于您对volatile变量的期望。现在,j是一个指向易失整数的指针;你是这个意思吗?如果是这样,那么它是安全的,因为您不需要访问易失性值,只需要访问其不易变的地址。

但是,如果您想要一个指向整数的易失性指针,则所需的语法为int* volatile j。在这种情况下,首先将它转换为非volatile指针可能会有问题,但我不认为如果您按原样尝试delete,编译器会抱怨。例如,G ++没有。

答案 3 :(得分:0)

这应该没问题,因为你在弃掉volatile之后没有访问变量。但是,我不知道为什么你会得到一个错误。我自己尝试了这些代码,一切似乎都没问题,你看到了什么?