2016-11-23 17 views
1

私は、64ビットの実行可能ファイルとしてコンパイルされたときにLinux上でうまく動作するC++プログラムを書いています。私はまた、Windows上で32ビットの実行可能ファイルとして、それをコンパイルし、それが次のメッセージでクラッシュ:私はサイズ20000 * 20000の整数の行列を割り当てる必要が通り32/64ビットWindows/Linuxアプリケーション

boost\boost_1_55_0\boost/test/minimal.hpp(123): exception "std::bad_alloc: bad allocation" caught in function: 'int __cdecl main(int,char *[])' 

、私はおそらく超えたことを自分自身に語りました32ビットプラットフォームで許容されるサイズ...

私はそれを64ビットWindows実行可能ファイルとしてコンパイルしても問題ありません。私の前提が正しいかどうかを確認するために、私はそれを32ビットのLinux実行可能ファイルとしてコンパイルすることにしました。だから私は、クラッシュの原因は、標準bad_alloc

  • 64ビットWindows =>実行OK
  • 32ビットで...

    • 32ビットWindows =>クラッシュ何ができるかについては考えていますLinuxの=>
    • 64ビットLinux OK実行=> OK実行
  • +4

    問題を再現できません。 [mcve]を私たちと共有してください。注:完全なコードは必要ありません。製造された[mcve]が必要です。 –

    答えて

    6

    32ビットWindowsのあなたは「さまざまなDLLを、あなたのプログラム、スタックおよび他のメモリと、単にアドレス空間の2ギガバイトの下を提供しますさまざまな場所に点在して割り当てられています。これは時には、あなたに与えるために連続した1つのチャンクに1.5GBを持たないことを意味します。

    私は実際には3GBのアドレス空間を提供すると信じているので、それは32ビットのLinuxで動作しています。それ以外の場合は、同じ問題が発生します。

    +0

    あなたは2GBのプロセス制限に間違いなく挑戦しています。しかし、ちょっと不思議なことに、仮想メモリでは、「連続したチャンク」は実際には重要ですか?コードが1.5GBチャンク全体を正常に割り当てたとしても、RAMと仮想メモリの異なるページに割り当てられます。 (または何かが紛失していますか?) – selbie

    +0

    @selbie仮想アドレス空間の連続したチャンクが必要です。どのようにマップされるかは関係ありません。 –

    +0

    @DanMašek - それは理にかなっています。 – selbie

    関連する問題