2012-02-24 4 views
0

リストのサイズを変更しようとすると、プログラムがクラッシュします...そのコードを見て、1,000,000,000(10^9)を入力してください... 7 x64 doesnt作業。C++ STLリストが1以上の数字でクラッシュする000 000 000

#include <cstdlib> 
#include <iostream> 
#include <list> 

using namespace std; 

int main(int argc, char *argv[]) 
{ 
    list<long long> l; 

    long long n; 
    cin>>n; 

    cout<<l.max_size()<<endl; 

    //uncomment 1 or 2 

    //l.resize(n,l.size()+1); //1st try 

    /*for (long long i=0; i<n; i++) //2nd try 
     l.push_back(n);*/ 


    //system("PAUSE"); // uncomment if needed 
    return 0; 
} 

"使用可能なメモリが" やや気まぐれな概念ですので、最大サイズは、l.max_size()戻り9^10 * 4を超えているが、最新のMinGW(G ++)を使用して、まだdoesntの仕事...イム

+6

10^9リスト要素でどれくらいのメモリを消費していると思いますか?たとえそれが単純な二重リンクリストであったとしても、2つのポインタ(2 x 8バイト)+値(別の8バイト)(すべての要素につき)は約24GBのメモリを必要とします。また、実装では、要素あたりの2x8Byte +データ型のサイズ以上のものを必要とすることもあります。 – Nobody

+6

'1000000000 * sizeof(long long)'はおそらくあなたのコンピュータが利用可能なRAMのバイト数より多いでしょう。 [RAMをさらにダウンロードする](http://www.downloadmoreram.com/)を試してみてください。 –

+2

なぜクラッシュするのですか?あなたは思い出に残っていますか? OSは、あなたのプログラムに2^64バイトを持つことを許可する必要はありません。実際には、64ビットシステムでさえもです。 – amit

答えて

12

ハードな最大値。あなたの「クラッシュ」は、メモリが不足していると思われる可能性が非常に高いstd::bad_allocです。

+0

これに加えて、現代のオペレーティングシステム上のプロセスは、オペレーティングシステムがクレイジーな割り当てを容易にすることを意味するわけではありません。そうではない)。 – jstephenson

+0

@jstephenson:Trueですが、これはC++実装の問題です。私が狂ったが法的な要求をするなら、それを否定しなければならない。これはOSの狂気を 'bad_alloc'に翻訳することです。 – MSalters

+0

+9、upvotesの1つは私のものです^^ 3分で受け入れます –

関連する問題