gpt4 book ai didi

c++ - 写入 std::vector 的保留空间会导致段错误吗?

转载 作者:行者123 更新时间:2023-11-27 23:49:35 28 4
gpt4 key购买 nike

我希望这不是一个有争议的问题,但我找不到关于 SO 的正确完整答案。这也不是关于方法 reserveresize 之间的区别或者 capacitysize 之间的区别的问题,这对我来说(希望)很清楚,并且经常被问到 SO。此外,这不是一个问题,如果这根本不是好的做法,那不是!

考虑以下情况:

#include <vector>
#include <iostream>

struct Foo
{
double a, b;
};

int main(int argc, char* argv[])
{
std::vector<Foo> Vec;
Vec.reserve(100);

Foo foo;
foo.a = -13.131;
foo.b = 3.141;

for(int i = 0; i < 100; ++i)
Vec[i] = foo;

for(int i = 0; i < 100; ++i)
std::cout << Vec[i].a << std::endl;

return 0;
}

我首先创建一个 Foo 的 std::vector 和保留内存,但不调整 vector 的大小。显然 size() = 0,但是 100 个元素的内存已经分配,​​现在可以由我的程序自由使用,所以从技术上讲,在内存中的任何位置写入和读取这些元素都不会导致在段错误中,这是正确的吗?

我尝试在 Ubuntu 14.04 上运行这段代码,一切都按预期工作,所有 100 个元素都已成功写入,所有输出也是 -13.131,即使 vector 大小保持为 0。如果我通过许多查找关于 SO 的答案,他们都正确地指出它会导致未定义的行为,因为元素没有被初始化,但它实际上是否会以任何方式导致段错误(不是谈论访问 vector 中未初始化指针的元素等) ?

有人问过类似的问题here这似乎证实了我的想法,但原则上它是否适用于所有支持 C++ 编译的平台?

最佳答案

一旦你有未定义的行为,它就是未定义的行为。未定义行为的一个关键方面是您无法确定在不同的系统和编译器上该行为会是什么。现在您可以查看特定编译器的代码和特定库实现,您会发现它按照您的预期运行。

但我认为您不会找到任何人愿意打赌这将适用于所有不同的系统、编译器和库实现。

举个例子,如果一个特定的 vector 实现决定使用保留内存来存储内部信息怎么办?也许这不太可能,但您如何确定实际上没有系统在执行此操作?

关于c++ - 写入 std::vector 的保留空间会导致段错误吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47436354/

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