4

とで次のようにlinux 2.6.32-220.7.1.el6.x86_64なりg++ 4.4.6ます。

次のコード:

#include <iostream>
#include <cstdlib>

int PROB_SIZE   = 10000000;
using namespace std;

int main(int argc, char *argv[])    {

    unsigned int numbers[PROB_SIZE];
    cout << "Generating " << PROB_SIZE << " random numbers... " << flush;

    return 0;
}

次のSIGSEGVを生成します。(gdb)run開始プログラム:/ home / cpd20202 / sorting / error

Program received signal SIGSEGV, Segmentation fault.
0x000000000040093b in main (argc=1, argv=0x7fffffffe4f8) at error.cpp:13
13      cout << "Generating " << PROB_SIZE << " random numbers... " << flush;
Missing separate debuginfos, use: debuginfo-install glibc-2.12-1.47.el6_2.5.x86_64 libgcc-4.4.6-3.el6.x86_64 libstdc++-4.4.6-3.el6.x86_64
(gdb) where
#0  0x000000000040093b in main (argc=1, argv=0x7fffffffe4f8) at error.cpp:13

私は本当にアイデアがありません。

4

5 に答える 5

8

これは、配列がスタックのサイズよりも大きいためです。したがって、関数呼び出し中に何か新しいものをプッシュしようとすると、プログラムがクラッシュします。

発生するエラーは、スタックオーバーフローと概念的に同じですが、ネストする関数呼び出しが多すぎるのではなく、ローカル変数が非常に大きいことが原因である点が異なります。

スタックは、ハウスキーピングおよびローカル変数の関数で使用するための小さなメモリ領域です。それは決して本当に大きくはなく、せいぜい数メガバイトです。これが、問題を取り除くために動的な割り当てが必要になる理由です。ほとんどの動的割り当てはヒープを利用しますが、これは多くの場合、物理メモリによってのみ制限されます。

ヒープに配列を割り当てる必要があります。そのためには、いくつかのオプションがありますが、最も簡単なのはおそらくを使用することstd::vector<int>です。これらは通常のアレイとほぼ同じように動作し、ストレージは自動的に管理されるため、これは問題にはなりません。

#include <vector>
#include <iostream>

int PROB_SIZE   = 10000000;
using namespace std;

int main()
{
    vector<int> numbers(PROB_SIZE);
    cout << "Generating " << PROB_SIZE << " random numbers... " << flush;

    return 0;
}
于 2012-05-14T00:18:44.317 に答える
5

「numbers」配列がスタックに割り当てられており、おそらく大きすぎます。アレイを動的に割り当てる必要があります。

于 2012-05-14T00:18:30.177 に答える
3

プロセスには、1,000万個の整数を割り当てるのに十分なスタックスペースがありません。これは40メガバイト(64ビットの場合は80 )であり、プロセスは通常、約1メガバイトintのスタックから始まります。

2つの基本的な選択肢があります。

  • 配列をグローバル変数として割り当てます(宣言を外部に移動しますmain)。
  • 、、、またはを使用して、配列をヒープに割り当てます。mallocnewstd::vector
于 2012-05-14T00:18:47.390 に答える
0

それはカウトではありません。非常に大きな配列numbersをスタックに割り当て、スタックを爆破します。スタックは通常8MB程度ですが、アレイは40MB程度です。

int v[size]; // stack
int v* = new int[size]; // heap
于 2012-05-14T00:19:25.487 に答える
0

スタックが処理するにはあまりにも多くのスペースを割り当てています (1,000 万 int は非常に大きな量です)。

実際にこれだけの量が必要な場合は、代わりに次を使用してヒープ領域を使用することをお勧めします。

malloc(sizeof(int) * 10000000);

于 2012-05-14T02:44:14.467 に答える