【发布时间】:2019-07-14 00:55:29
【问题描述】:
我一直在试验 C++ 的向量容器,并注意到当我使用向量的向量并在 for 循环中创建向量并将其推回给它时,我仍然能够访问在for循环。
我尝试用谷歌搜索它,但只在 C++ 中遇到了我不太了解的移动操作的提及。作为一名 C 程序员,当我尝试访问在堆栈上创建的向量时,我预计会出现分段错误,这些向量超出了下面代码中 for 循环的范围。有人可以在这里向我解释 C++ 在后台做什么吗?这怎么可能?
#include <iostream>
#include <vector>
using namespace std;
void display (const vector<vector<int> >& tdv) {
for (int i = 0; i < tdv.size(); i++) {
for (int j = 0; j <tdv[i].size(); j++) {
cout << " " << tdv[i][j];
}
cout << endl;
}
}
int main () {
vector<vector<int> > vov;
for (int i = 1; i < 5; ++i) {
vector<int> vec(i, i);
vov.push_back(vec);
}
display (vov);
return 0;
}
当我运行代码时,我得到以下输出:
1
2 2
3 3 3
4 4 4 4
【问题讨论】:
-
作为一名 C 程序员,当我尝试访问向量时,我预计会出现分段错误 -- 作为一名
C程序员,你知道你可以返回并按值传递struct,C没有问题?这是相同的概念,只是 C++ 使用构造函数和析构函数的概念将其扩展到其他类型。 -
任何类型的程序员都不会期望出现段错误。这是一个愚蠢的赌注,有时一个错误的指针指向有效的内存,你不会得到一个段错误。系统可能没有回收坏指针使用的内存,不会出现段错误。有时内存很快被同一程序的其他部分重用,而您不会遇到段错误。您可能没有收到段错误的原因有很多。
-
Segfaults 很糟糕,当你没有预料到它们时,它们却能避免没有得到 segfault 和代码践踏程序其他部分拥有的有效内存或写入的代码它曾经拥有数小时、数天或数年的内存,直到某些东西扰乱系统并且程序最终确实出现了段错误。墨菲定律说这将是一个糟糕的时期。就像机长打开飞机的自动驾驶仪时一样。
-
@user4581301 你是对的。我应该更加小心预期段错误。谢谢你的解释:)
标签: c++ vector scope c++-standard-library