Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.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++;理解在清理后访问全局变量不会产生某种错误 我有一个关于全局变量如何在C++中工作的问题。 我知道全局变量是邪恶的,所以这不是这个问题的重点。我只想更深入地了解以下示例中发生的情况。 #include <cstdint> #include <iostream> #include <vector> class B { public: B(); ~B(); private: static std::vector<int32_t> v_; }; B::B() { std::cout << "v_.size() = " << v_.size() << std::endl; for (auto i : v_) std::cout << i << std::endl; } B::~B() { std::cout << "v_.size() = " << v_.size() << std::endl; std::cout << "v_[0] = " << v_[0] << std::endl; std::cout << "v_.at(0) = " << v_.at(0) << std::endl; for (auto i : v_) std::cout << i << std::endl; } B b; std::vector<int32_t> B::v_ { 5, -7 }; int main() { return 0; }_C++_C++11_Compiler Errors_Runtime Error_Global Variables - Fatal编程技术网

c++;理解在清理后访问全局变量不会产生某种错误 我有一个关于全局变量如何在C++中工作的问题。 我知道全局变量是邪恶的,所以这不是这个问题的重点。我只想更深入地了解以下示例中发生的情况。 #include <cstdint> #include <iostream> #include <vector> class B { public: B(); ~B(); private: static std::vector<int32_t> v_; }; B::B() { std::cout << "v_.size() = " << v_.size() << std::endl; for (auto i : v_) std::cout << i << std::endl; } B::~B() { std::cout << "v_.size() = " << v_.size() << std::endl; std::cout << "v_[0] = " << v_[0] << std::endl; std::cout << "v_.at(0) = " << v_.at(0) << std::endl; for (auto i : v_) std::cout << i << std::endl; } B b; std::vector<int32_t> B::v_ { 5, -7 }; int main() { return 0; }

c++;理解在清理后访问全局变量不会产生某种错误 我有一个关于全局变量如何在C++中工作的问题。 我知道全局变量是邪恶的,所以这不是这个问题的重点。我只想更深入地了解以下示例中发生的情况。 #include <cstdint> #include <iostream> #include <vector> class B { public: B(); ~B(); private: static std::vector<int32_t> v_; }; B::B() { std::cout << "v_.size() = " << v_.size() << std::endl; for (auto i : v_) std::cout << i << std::endl; } B::~B() { std::cout << "v_.size() = " << v_.size() << std::endl; std::cout << "v_[0] = " << v_[0] << std::endl; std::cout << "v_.at(0) = " << v_.at(0) << std::endl; for (auto i : v_) std::cout << i << std::endl; } B b; std::vector<int32_t> B::v_ { 5, -7 }; int main() { return 0; },c++,c++11,compiler-errors,runtime-error,global-variables,C++,C++11,Compiler Errors,Runtime Error,Global Variables,为什么B的析构函数中向量的大小仍然是2 当我访问向量的元素时,我得到了随机内存,我理解这一点,因为向量在B之前就被清除了。但对我来说,向量的大小应该是0,甚至更好,在询问大小时抛出某种错误。即使使用at()函数,也不会抛出错误,因为大小仍然为2 我也知道我可以通过切换b和向量的初始化来解决这个问题。我的问题更多的是,为什么这个具体的例子没有抛出某种错误,因为在我看来它应该 注意:就像我的评论:为什么这个行为属于未定义的行为,而不是读取或写入非法内存位置,因为向量在该点不存在?我有点认为这会产生一

为什么B的析构函数中向量的大小仍然是2

当我访问向量的元素时,我得到了随机内存,我理解这一点,因为向量在B之前就被清除了。但对我来说,向量的大小应该是0,甚至更好,在询问大小时抛出某种错误。即使使用at()函数,也不会抛出错误,因为大小仍然为2

我也知道我可以通过切换b和向量的初始化来解决这个问题。我的问题更多的是,为什么这个具体的例子没有抛出某种错误,因为在我看来它应该


注意:就像我的评论:为什么这个行为属于未定义的行为,而不是读取或写入非法内存位置,因为向量在该点不存在?我有点认为这会产生一个SEG错误,我不明白为什么它不

未定义的行为意味着程序的行为不是由C++标准定义的。一致的C++编译器可以用<或<强>将> <强>的程序来执行<强> > < > >强> >,显示未定义的行为(是的,UB可以进行时间旅行)。
您的程序在
B::B
中构造之前,通过访问
v
作为对象来显示未定义的行为。假设它这样做,则没有任何关于程序执行的规定或被C++标准约束。

在这种情况下,编译器将UB访问视为访问空的
std::vector
。这是有效的,因为任何东西都是有效的。然后,程序继续运行,就像您没有执行UB一样(上述症状除外),这也是一个有效的选项

如果我们想象删除ctor中的UB,在销毁过程中,您的程序再次显示UB。这一次是通过在被销毁后作为
向量
对象访问
v
。同样,通过这样做,程序的行为没有被C++标准定义或约束,在UB之前、在和之后。 在这种情况下,它的行为就好像有一个2个值的向量,其值为0。这就是一致性,因为任何事物都是一致的


其中一种可能性是数据在堆上循环,但指针仍悬空。将向量的“腐烂”数据视为指针,它们仍然将2
sizeof(int)
分开,并且
.size()
将其读取为2。然而,所指向的数据已经在堆中回收,那里有不同的数据。

“我的问题是,为什么这个特定示例没有抛出某种错误,因为我认为它应该抛出某种错误。”为什么它应该抛出任何错误?未定义的行为是未定义的。可能的向量副本在该点不存在。它无能为力。您的程序已经在
B::B
中显示了未定义的行为,通过在其生命周期开始之前访问
B::v_
。所以这属于未定义行为,而不是读取或写入非法内存位置,因为向量在该点不存在?我有点想这会/应该会产生seg故障,我不明白为什么不会
$ ./test 
v_.size() = 0
v_.size() = 2
v_[0] = 0
v_.at(0) = 0
0
0