0

我正在编写一个 c++ 代码,我需要声明一个具有两个元素的类

class arr{
    public:
        long num;
        string str;
};

现在我需要存储这个类的近 1000000 个元素(取决于用户输入的类对象的数量可以在 1 <= n <= 1000000 的范围内警告对象是动态创建的

#include <iostream>
#include<string>

using namespace std;

class arr{
    public:
        long i;
        string str;
};

int main(){
    long n,j,i;
    cin>>n;
    arr a[n];

.... 程序的其余部分

但是如果 n 的值大于 100000 则程序挂起但对于小于 100000 的值可以正常工作我应该尝试什么方法一次声明超过 100000 个对象我尝试借助将 arra 分为两部分的二维数组来解决问题

arr [1000] [1000];

但这种方法对我不起作用

如果有人有任何想法请帮我提前谢谢

4

3 回答 3

4

只需使用std::vector

#include <iostream>
#include <vector>

int main(){
    long n;
    cin>>n;
    std::vector<arr> a(n);
}
于 2013-10-05T12:43:56.650 回答
1

what approach should i try to declare more than 100000 objects?

heap是在not 上声明它们stack,你在堆栈上声明了 1000000 个对象,这太过分了。小心,有堆栈限制:

C/C++ 程序的最大堆栈大小

为什么堆栈内存大小如此有限?

要在堆上声明它们,请使用:

arr *arr= new arr[n];

vector这与用于初始化元素的机制相同。

于 2013-10-05T14:24:17.620 回答
1

以下是关于为什么在堆栈上分配太大的对象会因分段错误而失败的一些背景信息,而相同数量的空间可能会以许多小块在堆栈上分配:

机制是,系统使用分配的少量内存设置堆栈。此分配由不可访问的内存区域保护。每当程序访问这个不可访问的区域时,硬件都会向内核发出警报;内核分析情况,推断程序需要更多的堆栈内存,将堆栈增长几个内存页,并告诉硬件正常继续执行程序。

只要访问的地址足够接近堆栈顶部,这就会完美地工作,因此内核可以安全地假设应用程序确实想要绘制一个新的堆栈帧,而不是由于错误而访问一些随机内存位置。在您的情况下,限制似乎在 16 MiB 左右。

你应该能够使用超过 16 MiB 的内存,如果你的堆栈帧都不大于 16 MiB,因为这样限制会在很多小步骤中提高,系统不会认为你只是访问了一个随机位置。

于 2013-10-05T15:08:46.943 回答