gpt4 book ai didi

C++: vector 边界

转载 作者:可可西里 更新时间:2023-11-01 14:56:03 28 4
gpt4 key购买 nike

我来自 Java,目前正在学习 C++。我正在使用 Stroustrup 的 Progamming Principles and Practice of Using C++。我现在正在使用 vector 。在第 117 页上,他说访问 vector 的不存在元素将导致运行时错误(在 Java 中相同,索引越界)。我正在使用 MinGW 编译器,当我编译并运行这段代码时:

#include <iostream>
#include <cstdio>
#include <vector>

int main()
{
std::vector<int> v(6);
v[8] = 10;
std::cout << v[8];
return 0;
}

它给我作为输出 10。更有趣的是,如果我不修改不存在的 vector 元素(我只是打印它期望运行时错误或至少一个默认值)它会打印一些大整数。那么...是 Stroustrup 错了,还是 GCC 有一些奇怪的编译 C++ 的方法?

最佳答案

这本书有点含糊。这与其说是“运行时错误”,不如说是在运行时出现的未定义行为。这意味着任何事情都可能发生。但错误完全是,而不是程序执行,事实上,甚至谈论具有未定义行为的程序的执行是不可能的,也是不明智的。

与 Java 完全不同,C++ 中没有任何东西可以保护您免受编程错误的侵害。


正如@sftrabbit 所说,std::vector 有一个替代接口(interface),.at() ,它总是给出一个正确的程序(尽管它可能会抛出异常),因此是一个可以推理的程序。


让我用一个例子来重复这一点,因为我相信这是 C++ 的一个重要的基础方面。假设我们正在从用户那里读取一个整数:

int read_int()
{
std::cout << "Please enter a number: ";
int n;
return (std::cin >> n) ? n : 18;
}

现在考虑以下三个程序:

危险的:这个程序的正确性取决于用户的输入!它不一定不正确,但它不安全(到了我称之为损坏的程度)。

int main()
{
int n = read_int();
int k = read_int();
std::vector<int> v(n);
return v[k];
}

无条件正确:无论用户输入什么,我们都知道这个程序的行为。

int main() try
{
int n = read_int();
int k = read_int();
std::vector<int> v(n);
return v.at(k);
}
catch (...)
{
return 0;
}

理智的上面带有.at() 的版本很尴尬。最好检查并提供反馈。因为我们进行了动态检查,所以未经检查的 vector 访问实际上保证没问题。

int main()
{
int n = read_int();

if (n <= 0) { std::cout << "Bad container size!\n"; return 0; }

int k = read_int();

if (k < 0 || k >= n) { std::cout << "Bad index!\n"; return 0; }

std::vector<int> v(n);
return v[k];
}

(我们忽略了 vector 构造可能抛出自身异常的可能性。)

道德是 C++ 中的许多操作是不安全的并且只有条件正确,但是程序员应该提前进行必要的检查。语言不会为你做,所以你不用为此付出代价,但你必须记住去做。这个想法是你无论如何都需要处理错误情况,所以与其在库或语言级别强制执行昂贵的、非特定的操作,不如将责任留给程序员,他们可以更好地集成检查进入无论如何都需要编写的代码。

如果我想开玩笑的话,我会将这种方法与 Python 进行对比,Python 允许您编写令人难以置信的简短正确 程序,而无需任何用户编写的错误处理根本。不利的一面是,任何试图使用这样一个程序的尝试,只要稍微偏离了程序员的意图,就会给您留下一个非特定的、难以阅读的异常和堆栈跟踪,并且几乎没有什么指导你应该做得更好。您不必编写任何错误处理程序,而且通常最终不会编写任何错误处理程序。 (我无法将 C++ 与 Java 进行比较,因为虽然 Java 通常安全,但我还没有看到简短 Java 程序。)

关于C++: vector 边界,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14015632/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com