抛弃挥发物是否安全?

Che*_*eng 8 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;

}
Run Code Online (Sandbox Code Playgroud)

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

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:'delete':无法将参数1从'volatile int*'转换为'void*'转换失去限定符

Ric*_*ton 5

没有什么。如果不访问易失性内存,则易失性的语义不受影响。如果您通过强制转换的非易失性指针访问易失性内存,编译器可能会优化引用。如果该值发生了变化,您就会得到错误的值。对于某些值的错误。;-)

删除不会访问易失性内存,它只是释放它。对于易失性存储器来说,这是一件不常见的事情。

  • Potatoswatter:是的,但是释放易失性内存意味着它首先是新的,否则就是一件坏事。我假设分配的内存在某种程度上是不稳定的。我怀疑事实并非如此。 (2认同)