大多数时候,我都是这样做的。
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;
}然而,我在这里看到了一篇文章:
转换易失性允许通过非易失性引用访问对象.这可能导致未定义的程序行为,甚至可能是意外的程序行为。
那么,我上面的代码示例的解决方法是什么呢?
这是如果我使用
删除j
注意,这是来自VC6的输出(不要问我为什么要使用VC6!)
c:\projects\a\a.cpp(5):error C2664:'delete‘:无法将参数1从“易失性int *”转换为“void*”转换失去限定符
发布于 2010-03-19 03:17:35
没什么。如果不访问易失性内存,则易失性的语义不会受到影响。如果通过抛出的非易失性指针访问易失性内存,编译器可能会优化引用。如果值发生了更改,您就会得到错误的值。因为一些错误的价值。;-)
delete不访问易失性内存,它只是释放它。与易失性记忆有关的一件不寻常的事情。
发布于 2010-03-19 03:27:32
deleteing一个volatile将意味着您已经序列化了对它的访问,因此实际上它不再是volatile了。删除易失性(一旦您知道它是安全的)的正确方法是使用const_cast<int*>。
如果指针(而不是int )是易失性的,那么您实际上是指int *volatile j。此外,如果类的所有成员都是易失性的,那么您可能希望同时限定整个对象,a volatile aa;。
发布于 2010-03-19 03:26:49
这取决于您期望从易失性变量中获得的意义。现在,j是一个指向易失性整数的指针,这就是您的意思吗?如果是这样的话,它是安全的,因为您不需要访问易失性值,只需要访问它的地址,而该地址是不易失的。
但是,如果您想要一个指向整数的易失性指针,那么所需的语法是int* volatile j。在这种情况下,首先将其转换为非volatile指针可能会有问题,但我认为如果您试图按原样将其转换为delete,编译器不会抱怨。以G++为例,情况并非如此。
https://stackoverflow.com/questions/2474756
复制相似问题