Cygwin上のGCCで(正確にはG++)1M以上のメモリを確保して、そのメモリに生でアクセスしようとしたらセグメンテーションフォールトが起きた。
なんでだろうと思ったが、プログラム全体で見ると動いていたのでとりあえず放置していたのが、やっぱりおかしいよなぁと思って検証してみた。
検証プログラム
#include "test-a.h" #includetest-a.hはtestクラスを持ち、そのコンストラクタ内で1Mのメモリをoperator newで確保し、printメソッドでメモリアドレスをプリントする。それだけ。int main() { void* p = (void*)new char[1024* 1024]; printf("%p\n", p); test t; t.print(); test *t2 = new test(); t2->print(); delete t2; return 0; }
実際はtestクラスの詳細はスタティックライブラリにしてある。スタティックライブラリの制限かなとも思ったので。
結果。
そもそも最初のnewで死んでた。
帰ってきたアドレスが、0x7fea0008。完全に死亡アドレスです。
理由は分からんが、アウトなんだろう。
しょうがないのでとりあえずWin32APIのVirtualAllocを使って回避。こっちならOKっぽい。
この制限があると、多き目のメモリープールとか不可能になる気がするが、どうなんだろう?
ってか、一気にメガ単位で確保しちゃ駄目ってこと?
誰か理由教えて(´;ω;`)
2011/10/25 追記
ひょっとしたらこの辺と関係あるかも=>Cygwinのヒープ