gpt4 book ai didi

c++ - 为什么这个数组分配会导致段错误?

转载 作者:行者123 更新时间:2023-11-30 03:49:40 25 4
gpt4 key购买 nike

我正在尝试创建一个整数 vector 数组,但我在这段代码中遇到了段错误。

int main() {
vector<int> x[1000000];
}

我认为这是因为我超出了堆栈大小,所以我使用了动态分配,它似乎解决了问题。但是,为什么这样做:

vector<int> x[1000000];

int main() {
// do nothing
}

这个有用吗?

int main() {
static vector<int> x[1000000];
}

最佳答案

这是因为在第一个示例中数组是在堆栈上分配的,而您的实现对可用堆栈施加了过于严格的限制。您的第二个示例可能完全靠运气取得了成功。

引用this picture在程序内存的正常布局上,访问白色区域可能会导致段错误(否则无论如何都是一个坏主意)。

现在,当您分配一个非静态局部变量时,直接数据将在堆栈上分配,但构造函数也可以通过 new 在堆上分配空间。在您的情况下,构造函数也可能会分配内存(vector 的直接数据可能与指针一样小,但您分配了其中的一百万个,因此至少有 8Mb 的直接数据)。可能是构造函数的存在实际上使您的程序发生段错误,因为在堆栈上分配的空间否则可能无法访问(当您实际访问堆栈限制之外的空间时,您将遇到段错误)。

当您分配静态或全局数据时,直接数据分配在数据或 BSS 段中,如果预启动数据(即运行构造函数之前的数据,如果有的话)为零,它将被放置在 BSS 段中。在您的情况下,数据很可能会放置在 BSS 中。

现在请注意,对于全局分配,构造函数将在您到达 main 之前运行(而不是静态的,直到第一次调用该函数才会运行),但是您可以通过 new< 进行动态分配 并在 main 之前调用 new 意味着未定义的行为你应该认为自己很幸运,第二个例子没有失败(它可以在没有事先通知的情况下这样做)。

从中吸取的教训是,只有在不需要复杂构造函数的情况下,您才最好将大数据放在全局范围内。如果您需要一个复杂的构造函数,您最好通过 new 动态分配它。您当然可以将其作为本地 static 放入,并在全局需要时返回对该对象的引用。

关于c++ - 为什么这个数组分配会导致段错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32322915/

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