首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >抛弃不稳定是安全的吗?

抛弃不稳定是安全的吗?
EN

Stack Overflow用户
提问于 2010-03-19 03:11:36
回答 4查看 5.6K关注 0票数 8

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

代码语言:javascript
复制
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

转换易失性允许通过非易失性引用访问对象.这可能导致未定义的程序行为,甚至可能是意外的程序行为。

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

这是如果我使用

删除j

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

c:\projects\a\a.cpp(5):error C2664:'delete‘:无法将参数1从“易失性int *”转换为“void*”转换失去限定符

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-03-19 03:17:35

没什么。如果不访问易失性内存,则易失性的语义不会受到影响。如果通过抛出的非易失性指针访问易失性内存,编译器可能会优化引用。如果值发生了更改,您就会得到错误的值。因为一些错误的价值。;-)

delete不访问易失性内存,它只是释放它。与易失性记忆有关的一件不寻常的事情。

票数 4
EN

Stack Overflow用户

发布于 2010-03-19 03:27:32

deleteing一个volatile将意味着您已经序列化了对它的访问,因此实际上它不再是volatile了。删除易失性(一旦您知道它是安全的)的正确方法是使用const_cast<int*>

如果指针(而不是int )是易失性的,那么您实际上是指int *volatile j。此外,如果类的所有成员都是易失性的,那么您可能希望同时限定整个对象,a volatile aa;

票数 3
EN

Stack Overflow用户

发布于 2010-03-19 03:26:49

这取决于您期望从易失性变量中获得的意义。现在,j是一个指向易失性整数的指针,这就是您的意思吗?如果是这样的话,它是安全的,因为您不需要访问易失性值,只需要访问它的地址,而该地址是不易失的。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2474756

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档