我正在编写一个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];
但这种做法对我不起作用
如果有任何人有任何想法,请帮助我解决这个问题 提前谢谢
答案 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的内存,因为这样会在很多小步骤中提高限制,系统不会认为你刚访问了一个随机位置。