如何使用1000000元素c ++声明类

时间:2013-10-05 12:41:34

标签: c++ arrays class object declaration

我正在编写一个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我应该尝试在一个go中尝试声明超过100000个对象我试图解决问题借助于2D数组分离arra分两部分

arr a [1000] [1000];

但这种做法对我不起作用

如果有任何人有任何想法,请帮助我解决这个问题 提前谢谢

3 个答案:

答案 0 :(得分:4)

只需使用std::vector

即可
#include <iostream>
#include <vector>

int main(){
    long n;
    cin>>n;
    std::vector<arr> a(n);
}

答案 1 :(得分:1)

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

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

C/C++ maximum stack size of program

why is stack memory size so limited?

在堆上声明它们,使用:

arr *arr= new arr[n];

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

答案 2 :(得分:1)

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

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

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

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