0

私はC++コードを書いています.2つの要素を持つクラスを次のように宣言する必要があります.

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 を 2 つの部分に分割している 2D 配列の助けを借りて問題を解決しようとしました

arr a[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

スタックに大きすぎるオブジェクトを割り当てるとセグメンテーション違反が発生し、同じ量のスペースが多くの小さなチャンクでスタックに割り当てられる可能性がある理由に関する背景情報を次に示します。

メカニズムは、システムが割り当てられた少量のメモリでスタックをセットアップすることです。この割り当ては、アクセスできないメモリ領域によって保護されています。プログラムがこのアクセスできない領域にアクセスするたびに、ハードウェアはカーネルに警告します。カーネルは状況を分析し、プログラムがより多くのスタック メモリを必要としていることを推測し、スタックをメモリ ページ数だけ増やし、ハードウェアに通常どおりプログラムを実行し続けるように指示します。

アクセスされたアドレスがスタックのトップに十分近い限り、これは完全に機能します。これにより、カーネルは、バグのためにランダムなメモリ位置にアクセスする代わりに、アプリケーションが実際に新しいスタック フレームを作成したいと安全に想定できます。あなたの場合、制限は約 16 MiB のようです。

16 MiB を超えるスタック フレームがない場合は、16 MiB をはるかに超えるメモリを使用できるはずです。ランダムな場所。

于 2013-10-05T15:08:46.943 に答える
1

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

heapではなく で宣言するstackことです。スタックで 1000000 オブジェクトを宣言しています。これは多すぎます。スタック制限があるので注意してください:

プログラムの C/C++ 最大スタック サイズ

スタックメモリサイズが制限されているのはなぜですか?

それらをヒープで宣言するには、次を使用します。

arr *arr= new arr[n];

vectorこれは、が要素を初期化するために使用するのと同じメカニズムです。

于 2013-10-05T14:24:17.620 に答える