大多数时候,我都是这样做的。
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;
}
但是,我在这里看了一篇文章:
抛弃volatile允许访问 通过非易失性的对象 参考。这可能导致 未定义的,也许是无意的 程序行为。
那么,上面代码示例的解决方法是什么?
以下是我使用
时收到的错误消息删除j
请注意,这是从VC6输出的(不要问我为什么使用VC6!)
c:\ projects \ a \ a.cpp(5):错误C2664: '删除':无法转换参数1 从'volatile int *'到'void *' 转换失去限定符
答案 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
之后没有访问变量。但是,我不知道为什么你会得到一个错误。我自己尝试了这些代码,一切似乎都没问题,你看到了什么?