Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++11使用指针修改初始值设定项_列表中的元素导致SIGSEGV,为什么?_C++_C++11_Initializer List_Segmentation Fault_Const Cast - Fatal编程技术网

C++11使用指针修改初始值设定项_列表中的元素导致SIGSEGV,为什么?

C++11使用指针修改初始值设定项_列表中的元素导致SIGSEGV,为什么?,c++,c++11,initializer-list,segmentation-fault,const-cast,C++,C++11,Initializer List,Segmentation Fault,Const Cast,我使用const_cast修改初始值设定项列表中的元素,如下所示: #include <initializer_list> int main() { auto a1={1,2,3}; auto a2=a1;//copy or reference? for(auto& e:a1) { int*p=const_cast<int*>(&e); ++(*p); } for(auto&a

我使用const_cast修改初始值设定项列表中的元素,如下所示:

#include <initializer_list>
int main()
{
    auto a1={1,2,3};
    auto a2=a1;//copy or reference?
    for(auto& e:a1)
    {
        int*p=const_cast<int*>(&e);
        ++(*p);
    }
    for(auto& e:a2)
        cout<<e;
    return 0;
}
不幸的是,当执行+++*p时,这个g++4.9.2编译程序抛出SIGSEGV。这个问题在VC中不会发生

为什么,我的程序有任何不安全的操作吗?请帮助,谢谢。

与上一个问题一样,初始值设定项列表的基础数组由常量对象组成。修改声明为常量的对象是未定义的行为。从[dcl.type.cv]:

除了任何声明为可变7.1.1的类成员都可以修改外,任何修改常量的尝试 对象在其生命周期3.8期间会导致未定义的行为

未定义行为的一个可能实例是SIGSEV,这是您从gcc中看到的。另一个可能的实例化是代码工作,这是您在VC中看到的。不要这样做

与上一个问题一样,初始值设定项\u列表的基础数组由const对象组成。修改声明为常量的对象是未定义的行为。从[dcl.type.cv]:

除了任何声明为可变7.1.1的类成员都可以修改外,任何修改常量的尝试 对象在其生命周期3.8期间会导致未定义的行为


未定义行为的一个可能实例是SIGSEV,这是您从gcc中看到的。另一个可能的实例化是代码工作,这是您在VC中看到的。不要这样做

修改最初声明的常量数据是未定义的行为,初始值设定项列表的内容总是常量

在本例中,列表的内容似乎存储在只读页面或类似的页面中,并且您将得到一个运行时错误。你很幸运:没有定义的行为,任何事情都可能发生

另一个由写入const引起的未定义行为的经典示例是,当您在一行上修改某个内容,而在下一行上读取该内容时,这些修改不会显示出来。之所以会出现这种情况,是因为编译器可以假设任何声明为未引用数据的常量都不会更改,因此它可以优化其代码,以假定初始值是它始终具有的值

编译器实际执行的其他可能性是,编译器注意到您在分支上执行未定义的行为,推断无法从逻辑上执行该分支,得出进入该分支的条件必须是其他设置,以及完全消除分支和/或进入前提由上述逻辑证明的分支。未定义的行为可能导致时间旅行

你的硬盘可能会被格式化,电脑可能会爆炸,它会通过电子邮件将你的网络历史记录发送给你的父母:编译器可以自由地让代码在任何时候做任何事情,无论是出于任何原因还是出于任何原因


不要执行未定义的行为。

修改最初声明的常量数据是未定义的行为,并且初始值设定项列表的内容始终是常量

在本例中,列表的内容似乎存储在只读页面或类似的页面中,并且您将得到一个运行时错误。你很幸运:没有定义的行为,任何事情都可能发生

另一个由写入const引起的未定义行为的经典示例是,当您在一行上修改某个内容,而在下一行上读取该内容时,这些修改不会显示出来。之所以会出现这种情况,是因为编译器可以假设任何声明为未引用数据的常量都不会更改,因此它可以优化其代码,以假定初始值是它始终具有的值

编译器实际执行的其他可能性是,编译器注意到您在分支上执行未定义的行为,推断无法从逻辑上执行该分支,得出进入该分支的条件必须是其他设置,以及完全消除分支和/或进入前提由上述逻辑证明的分支。未定义的行为可能导致时间旅行

你的硬盘可能会被格式化,电脑可能会爆炸,它会通过电子邮件将你的网络历史记录发送给你的父母:编译器可以自由地让代码在任何时候做任何事情,无论是出于任何原因还是出于任何原因

不要做未定义的行为。

auto a2=a1;永远不会成为参考,只是一份副本。如果需要引用,则需要像auto&a2=a1;您在caste上执行了const_cast,然后执行了一个变异,您想知道您的程序是否有任何不安全的操作?auto a2=a1;永远不会成为参考,只是一份副本。如果需要引用,则需要像auto&a2=a1;您在caste上执行了const_cast,然后执行了一个变异,您想知道您的程序是否有任何不安全的操作?