gpt4 book ai didi

c++ - 为什么内置数组不安全?

转载 作者:IT老高 更新时间:2023-10-28 12:49:39 26 4
gpt4 key购买 nike

这本书 C++ Primer, 5th edition 作者 Stanley B. Lippman (ISBN 0-321-71411-3/978-0-321-71411-4) 提到:

An [std::]array is a safer, easier-to-use alternative to built-in arrays.

内置数组有什么问题?

最佳答案

  1. 内置数组是一个连续的字节 block ,通常在堆栈上。你真的没有像样的方法来保存有关数组、它的边界或它的状态的有用信息。 std::array 保留此信息。

  2. 内置数组在传入/传给函数时会衰减为指针。这可能会导致:

    • 当传递一个内置数组时,你传递一个原始指针。指针不保留有关数组大小的任何信息。您将不得不传递数组的大小,从而使代码变得丑陋。 std::array 可以作为引用、复制或移动传递。

    • 没有办法返回一个内置数组,如果数组是在那个函数范围内声明的,你最终会返回一个指向局部变量的指针。std::array 可以安全返回,因为它是一个对象,并且它的生命周期是自动管理的。

  3. 你不能真正对内置数组做有用的事情,例如分配、移动或复制它们。您将结束为每个内置数组编写自定义函数(可能使用模板)。 std::array 可以赋值。

  4. 通过访问超出数组边界的元素,您将触发未定义的行为std::array::at 将执行边界检查并在检查失败时抛出常规 C++ 异常。

  5. 更好的可读性:内置数组涉及指针运算。 std::array 实现了有用的函数,例如 frontbackbeginend避免这种情况。

假设我想对一个内置数组进行排序,代码可能如下所示:

int arr[7] = {/*...*/};
std::sort(arr, arr+7);

这不是有史以来最健壮的代码。通过将 7 更改为不同的数字,代码会中断。

使用 std::array:

std::array<int,7> arr{/*...*/};
std::sort(arr.begin(), arr.end());

代码更加健壮和灵活。

为了清楚起见,内置数组有时会更简单。例如,许多 Windows 和 UNIX API 函数/系统调用需要一些(小)缓冲区来填充数据。我不会使用 std::array 而不是我可能正在使用的简单 char[MAX_PATH] 的开销。

关于c++ - 为什么内置数组不安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33319739/

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