2011-01-29 11 views
3

私は最近、たくさんのメモリを使用してきました。メモリ管理や少なくともmallocのポインタを使用すると、それが最も些細なことならば。これにより、できるだけスタックに割り当て、&を使用して場所を取得するようになりました。独立したintとinptr変数を作成していても(私はマクロで&演算子で左辺値の問題がありました)。Cのベストプラクティス、スタック対ヒープの割り当て

私は、割り当てられた場所(上/下)にデータを渡すことに対処しなければならなかった場所がたくさん見つかりませんでした。同時に、私は早いリターンのかなりの量を必要とする(そして、私はむしろgotosを避けるだろう)。一般的な意見は何ですか?特定の場合に、私が別のものを使用するべき明白な兆候はありますか?

P.S.私が少し心配したことの一つは、mallocに間違ったsizeofを使用したために最近メモリ破損の問題が発生し、そのポイントの直後のコードパスのほとんどがヒープを利用していなかったので、 。この種の腐敗隠滅はどれほど大きな問題だと思いますか?

+0

http://stackoverflow.com/questions/102009/when-is-it-best-to-use-a-stack-instead-of-a-heap-and-vice-versa –

+6

「goto」を使用していません。 * C *でのクリーンアップのためには、賢明なコーディングスタイルではなく、盲目のドグマのように聞こえます。 – delnan

+1

そのリンクは関連しているものはC++では全く同じではありません。1つのことは、より多くの人気を集めているリファレンスではないのですか? –

答えて

7

場合はmallocを使用する必要があります:あなたはリスク他の(あなたがデータの変数または単に大量に割り当てているコールスタックまでstatic constデータを非へのポインタを渡し、または

  • いる

    1. スタックオーバーフロー)。

    その他の場合は、スタックの割り当てが適切である必要があります。

  • +0

    "非静的"を意味しますか? –

    +0

    @Oli:いいえ、私は本当に非コンスです。つまり、チェーン上の 'static const'メモリへのポインタを渡すことはOKですが、' static'非 'const 'メモリへのポインタは、通常、悪いスタイル/デザイン、スレッド安全性の欠如、デバッグが難しい、 –

    +0

    真。しかし、大きな問題はスタックデータへのポインタを返すことです! –

    3

    ビットトングの頬:あなたがスタックを使い果たしたときの確実なサインです。

    返されたデータが複雑な場合は、多くの場合、呼び出し元に返すデータ を返すときには、ポインタを返すほうがコピーを返すほうが効果的です。

    +0

    注:これはちょうど私が約1MBのものをメインの一番上に置き、何らかの形で実行可能イメージの書き込み不可能な部分に書き込もうとしたと思います。 –

    2

    技術的にOPの質問に直接関係しないものの、それは同じボールパーク内にあります(これは私の答えには十分な正当性があります)。

    "Boehm C Garbage Collector"をご覧ください。時間をかけてテストされたソフトウェアであり、何度も問題なく何度も使用しています。これにより、効果的にmallocをすべて使用でき、対応するfreeを忘れてしまいます。

    +3

    ガベージコレクタではないCは – Mandrake

    +3

    そしてBoehm GC **は動作しません**。それは致命的な解決不可能な壊滅的なメモリリークを持ちます.C + GCは本質的に不可能です。 –

    0

    スタック割り当ては、少量のデータを処理する必要があり、このデータが1つの関数でのみ必要な場合に便利です。代わりに関数間でポインタを渡す必要がある場合は、関数から終了するとスタックが毎回上書きされる可能性があるため、ヒープ上のメモリをmalloc()する方がよいでしょう。ローカルデータが127バイトを超えると、実行が遅くなる可能性があります。オフセットがこの制限内にある場合、命令自体に含めることができるため(例:mov eax, [ebp - 4])、文字バッファをヒープに割り当てる必要がありますこの制限を超えない)。 free()についてのもう一つのこと(downvotedされたコストで):あなたのメモリを解放することは、事実osがあなたにアプリケーションに与えたすべてのメモリを取り戻すことは要求されていませんが、それは悪いプログラミングの練習、メモリリークなどのエラーが発生します。

    関連する問題