2012-03-13 9 views
-3

私は移植のためにopenglを使うためにcで構築されたゲームを移植しています。いくつかの理由で、ゲームのmalloc機能が機能しなくなるまで、すべてうまくいっていました。関数mallocはNULLを返しますが、最初の10回だけです

私はこれに対する答えを探しています。私が見つけた唯一の事は、mallocがNULLを返すことです。数バイトの単純な構造を作成する非常に単純なmallocです。

私はいくつかの試行を行い、ループ内でコマンドを書きました。そして私の驚きは、それが最初の10回失敗したことでしたが、その後はコマンドが働き、ゲームが始まりました。その構造は問題なく何度も作成されています。

私はそれをそのまま残すと言いますが、何か間違っていると確信しており、他のシステムでは正しく動作しない可能性があります。だからこそ私はどんな種類の問題を抱えているのか、それを避ける理由と方法を尋ねたいのです。環境はそれほどフレンドリーではなく、デバッグツールが不足しているので、できるだけ多くの詳細を理解しています。

ありがとうございました。

編集: コードは単純です。

ObjectBase* newcoin; 
newcoin= (ObjectBase*)calloc(1,sizeof(ObjectBase)); 

ObjectBaseの構造は非常に小さいですが、 200バイト以下。

ハードウェアは、4 GBまたはメモリを搭載したWindows 7ベースのコンピュータです。この場合でも、エラーは次のようになります。

Visual C++ CRT: Not enough memory to complete call to strerror 

以前はうまくいきました。 その他の問題。私はディスクからファイルを読み込むときに同じ問題を抱えています。それは約10〜15回起こり、正しく動作します。 問題は常に発生します。アプリケーションを再起動するたびにクラッシュします。

+1

重要なコードを追加してください。そういう意味で私たちは判断できません。 – DonCallisto

+3

あなたの環境(ハードウェア、OS、コンパイラ)は何ですか?いくつかのコードを投稿できますか?問題は正確に再現可能ですか?可能性は低いですが、実行中のメモリの量が実際に変化している可能性があります。 –

+0

投稿コード – Dan

答えて

0

valgrindを使用して、プログラムのメモリリークをデバッグします。

あなたのプログラムが漏れていないこと、または不正行為がないことを確認した場合は、 mallocの場合、使用可能なメモリがないため、mallocがNULLを返すことがあります。 freeとNULL malloc戻り、その後、いくつかのサードパーティのライブラリのリリースいくつかのメモリということも起こりうる

、その後、mallocは再びいくつかの新鮮なメモリをあなたを与えることができます。

また、代わりにmallocGC_mallocを使用し、自由INGのメモリについてはあまり気にしないでBoehm's conservative garbage collectorを使用して検討するかもしれません。

Linux上であれば、あなたのプロセスについて学ぶために/proc擬似ファイルシステムを使用して(も/proc/self/mapsプロセスの内部から、PID 1234のプロセスのために、例えば/proc/1234/maps、および/proc/self/statmなど)。 pmapコマンドも参照してください。

+0

申し訳ありませんが、私はこれらのライブラリをサポートしない複数のシステムにアプリケーションを移植する必要があるため、私はそれに頼ることはできません。私が言うことができるのは、これがopenglに移植する前に動作していたことだけです。変更された唯一のものは、OpenGLのものを使用する構造の名前です。アプリケーションが約30MBのメモリしか使用しないため、特にメモリを増やす必要はありません。 – user1267350

+0

いくつかのシステムでは 'valgrind'を使っていくつかのメモリリークをデバッグすることができます(そしてこれらのリークはおそらくあなたのコードの中にあり、システムには依存しません)。 –

関連する問題