0

私は現在 C++ で作業しており、この課題に直面しています。ヘッダーファイルの私のクラスのコードは次のとおりです。

class PID
{
   private:
   int PID;
   int total;

   public:
   PID(); // Constructor
   int returnPID(); // Returns PID.
};

cpp ファイルのコード宣言は次のとおりです。

PID::PID()
{
    PID=INT_MAX;
    total=0;
}

int PID::returnPID()
{
    return PID;
}

そして、クラス PID のオブジェクトへのポインターを含むテーブルの主な宣言と初期化は次のとおりです。

PID* table[1000000];

for (int i=0; i<1000000; i++)
{
    table[i]=new PID;
}

したがって、これは上で作成したコンストラクターを使用して PID を MAX_INT に設定すると思います。すべての初期化内で returnPID を使用して table[i].PID のコンテンツにアクセスしようとすると、次のようにうまく機能します。

for (int i=0; i<1000000; i++)
{
    table[i]=new PID;
    int display=table[i]->returnPID();
    cout<<display<<endl;
}

この問題は、テーブル [i] の外部および初期化後にコンテンツにアクセスしようとすると発生します。メインがクラッシュし、エラーとして数字 (-1073741571) が返されます。メインからのコマンドは1つも実行されていないようです。問題を再現すると思われるコードのサンプルを次に示します。

for (int i=0; i<1000000; i++)
{
    table[i]=new PID;
}
for (int i=0; i<1000000; i++)
{
    int display=table[i]->returnPID();
    cout<<display<<endl;
}

私はこれに2時間以上取り組んできましたが、解決策はありませんでした.論理的ではないようです. 誰にもこれについて説明がありますか?

編集:スポット数が 1.000.000 未満のテーブルはすべて正しく機能します。関係はまだわかりませんが、これと関係があるのか​​もしれません。

4

2 に答える 2

3

誰にもこれについて説明がありますか?

スタックスペースが不足しているようです。

コンパイラは、100 万の PID* ではなく、100 万の整数を処理できますか?

スポット数が 1.000.000 未満のテーブルはすべて正しく機能します。関係はまだわかりませんが、これと関係があるのか​​もしれません。

それはそれと関係があります。

私はこれを試しました:

int main(){
    int bec[10000000];
    for (int i=0; i<10000000;i++){
        bec[i] = i;
    }
    printf("%d\n",rand()%1000);
    return 0;

}

あなたと同じ理由でセグメンテーション違反です。

この問題を解決する唯一の方法は、使用するスタック スペースを減らすことです。main の外で bec を宣言し、そのためにスタック領域を使用しないか、std::vector を使用できます。たくさんのオプションがあります。

于 2012-11-05T00:53:51.883 に答える
0
PID* table[1000000];

問題があります。これは、自動的に割り当てられた 1,000,000 個のポインターの配列、または [最大] 800 万バイトです。多くの場合、スタック スペースはかなり制限されており、大量に使用しています。「制限付き」とは、8MB ではなく 8KB のことです。

これを調べると、多くの場合、結果はきれいではありません

8MB は、自動割り当て (「スタック上」と呼ばれるもの) には十分です。std::vectorそのため、ストレージ メカニズムの調整を検討するか、動的割り当ての使用を検討してください。

ところで..それが含まれているクラスと同じ名前のメンバー変数を持つことはばかげています。

于 2012-11-05T01:06:15.530 に答える