2

Ubuntu で C++ プログラムを作成しました。メイン関数には、次のような 2 次元配列があります。

int main() {
   unsigned long long int s[11000][100];
   // some code to manipulate with s (just for initialization)
   // ...
}

そして、プログラムは実行できませんでした。Web を検索した後、2 次元配列のサイズが Ubuntu のデフォルトのスタック サイズである約 8 MB を超えていることがわかりました。プログラムでスタックサイズを自動的に変更する提案をいくつか試しました。そこで、数行のコードを追加しました。

int main() {
   unsigned long long int s[11000][100];
   const rlim_t kStackSize = 32 * 1024 * 1024;
   struct rlimit rl;
   int result;

   result = getrlimit(RLIMIT_STACK, &rl);
   if (result == 0) {
      if (rl.rlim_cur < kStackSize) {
         rl.rlim_cur = kStackSize;
         result = setrlimit(RLIMIT_STACK, &rl);
         if (result != 0) {
            printf("error\n");
         }
   } else {
        printf("error\n");
   }

   // some code to manipulate with s (just for initialization)
   // ...
} // end main

しかし、まだセグメンテーション違反 (コア ダンプ) エラーが発生します。スタック サイズも確認しました。現在、そのサイズは 32 MB で、2 次元配列のサイズの 4 倍です。また、スタック サイズを RLIM_INFINITY に設定しようとしましたが、再び失敗しました。理由と解決策を教えてくれる人はいますか?どうもありがとう!

4

2 に答える 2

5

このメモリ ブロックのサイズを考えると、必要に応じて、または、または、どちらかで割り当てる必要new[]mallocありdelete[]ますfree。または、C++ を使用している場合は、std::vectorまたはその他のヒープ割り当てコンテナーを使用する必要があります。

まだクラッシュしている理由は、調整しようとする前に、まだ制限されているスタック領域に制限を超えて割り当てようとしているからです。自動ストレージ内 (つまり、スタック上) の変数は、関数が実行される前に割り当てられます。

于 2013-09-24T17:14:55.313 に答える
2

この種の問題を解決する 1 つの解決策は次のとおりです。

Always declare large arrays globally.

これにより、グローバル変数のメモリがに割り当てられるため、あなたの問題などを回避できますInitialized Data Segment。詳細については、こちらを参照してください。お役に立てれば。

于 2013-09-24T17:23:03.173 に答える