将大数组放入结构中时堆栈溢出

问题描述 投票:0回答:1

我有一个结构,但我的变量是全局的,如下所示:

const int kol=1e6;
int par[kol];
int h[kol];
int aps[kol];
struct dsu
{

    void add(int v)
    {
        par[v]=v;
        aps[v]=v;
    }// and more...
}

之后,我想要两个 dsu 树,但问题是它们使用相同的源(par[kol] 和 aps[kol] 对于它们来说是相同的),所以我需要将这些数组设为本地数组,如下所示:

struct dsu
{
    int par[kol];
    int h[kol];
    int aps[kol];
    void add(int v)
    {
        par[v]=v;
        aps[v]=v;
    }
}// and more...

但是当我运行代码时它给了我运行时错误:

c++ arrays struct local-variables
1个回答
1
投票

错误

0xC00000FD
STATUS_STACK_OVERFLOW
。您的应用程序正在崩溃,因为您在应用程序主线程的调用堆栈上放置了太多数据。

1e6
是 106 即 1000000。因此,每个数组的大小是
sizeof(int) * 1000000
字节,并且您有 3 个。即 11MB 内存(假设
int
的大小为 4 字节)。

当数组位于结构体内部,并且该结构体的实例在线程调用堆栈内的自动内存中声明(即,作为函数内部的局部变量)时,您将占用 11MB 的线程堆栈内存,但是大多数线程堆栈默认只能容纳 1-4MB,具体取决于平台和项目设置。

全局内存没有这样的限制。当它首次加载到内存中时,在任何线程开始运行之前,它会作为应用程序的一部分静态分配。您可以拥有 11MB 的全局内存。更糟糕的是,它只会使 exe 文件的大小膨胀。

如果您的结构中确实需要如此大的数组,则必须在运行时使用

new int[kol]
或更好的
std::vector<int>(kol)
在动态内存中分配每个数组。或者,保留数组不变,并使用
new dsu
或更好的
std::make_unique<dsu>()
动态分配结构本身。

© www.soinside.com 2019 - 2024. All rights reserved.