mallocmallocとスコープ私はmallocの周りを頭の中で包み込むために、特に自由でなければならないときには苦労しています。free():無効な次のサイズ(高速):...私はcharポインタを解放しようとします。入力ファイルから読み込むと、次の行を実行すると特定の行でクラッシュします。sometimes}xがNULLであるなどの明白なことを確認しましたが、そうではありません。それはちょうどランダムな線でクラッシュします。charポインタと同じ規則を持っていますか?プログラムのクラッシュ時にgccに入っているエラーから、私はmallocとfreeを理解していないだけです。私はGoogleと質の高い時間を過ごしましたが、まだ私はレンガの壁に当たっています。あなたが見つけた良い資源はありますか?私が見ているすべては、mallocを使うたびに無料で使う必要があると言います。私はそれを試み、私のプログラムはクラッシュします。変数のスコープに基づいて異なるかもしれません。uk何かあなたはmalloc()、あなたはもうそれを使用する必要がなくなったとき(1回)無料です。free(...)できるので、これは問題ではないことに気づいただけです。)は関係なく、ポインタです。values.ダイナミックアロケーションが必要なのみ時間は、特定のスコープよりも長く必要なデータがある場合です。そのようなデータは動的に割り当てられなければならず、最終的には不要になったときに解放される必要があります。これの最も基本的な使用例は、典型的なリンクリストです。一般的な「挿入/消去/検索」リスト操作関数を使用する場合は、リストノードを任意のスコープに対してローカルにすることはできません。したがって、各ノードは動的に割り当てられなければならず、リスト操作関数は、もはやリストの一部ではないノードを解放することを保証しなければならない。可能であれば、すべてを自動化し、何もする必要はありません。必要に応じて動的割り当てを使用し、必要に応じて手動で割り当てを解除してください。emliは、@Oliは言うとおり、動的割り当てを厳密にローカルコンテキストで使用することもできます)自動変数の利用可能な領域を超えると、通常、「パイルオーバーラン」などのカラフルな名前が付けられます。可能であれば、動的割り当てを避けるためのアドバイスは+1。源@OliCharlesworth:ああ、はい、別の良い点!編集されました。源あなたがそれを説明した方法は間違いなく助けになりました。使用しようとしていました。源アウトリビングスコープにならないダイナミックアロケーションの例は、スタックを壊す大規模な配列(例えば、100万の要素)が必要な場合です。スコープ(つまり、関数やループとは関係ありません)。ような関数の使用が含まれますが、原則は同じです。Charlesworth源@xixonia:クラッシュは、あなたが期待するべきものではなく、最良のシナリオです。最悪の場合は、攻撃者のルートを与えています。源free(...)を2回呼び出すとクラッシュする可能性があることに注意してください。free()に渡されなければなりません。free()をクリックします。呼び出さないと、メモリリークが発生します。渡すことができるアドレスが範囲外になるときに起こる可能性があります。車のキーを紛失したようなものです。車はまだありますが、。渡すヌルポインタを返すためです。あなたはすることはできません。厳密に言えば、Cの単語は「生涯」ではなく「保存期間」です。源あなたは「スコープ」ではなく「生涯」を意味します。スコープは、オブジェクトではなく識別子に適用されます。"生涯"を意味します。6.2.4節2を参照のこと。源アクセスしなくなったらメモリを解放する必要があります。アクセスする場合はメモリを解放しないでください。これはあなたに多くの痛みを与えるでしょう。Dymitruk源malloc(n)は、ヒープという名前のメモリロケーションからnバイトのメモリを割り当ててから、void型のポインタを返します。メモリは実行時に割り当てられます。一度メモリを動的に割り当てると、スコープはポインタ(またはポインタのアドレス)をポインタと一緒に保持している限り重要ではありません。p;}この関数は単純にn個の整数に等しいヒープからメモリを割り当て、最初の場所へのポインタを返します。ポインタは、呼び出し元の関数で使用することができます。スコープは、ポインタがあなたと同じであれば問題ありません。free(p)はヒープにメモリを返します。あなたが覚える必要がある唯一の事は、あなたがそれを解放せず、そのアドレスの価値を失うかのようにそれを解放することです。メモリリークが発生します。OSによれば、あなたは解放していないのでメモリを使用しているので、メモリリークが起こるからです。同じメモリが別の目的のために他の時間に再び割り当てられるかもしれないので、あなたが再びそれを使用しないようにnullをポインタの値を設定するだけで解放した後....だから、あなたがする必要があるのは注意することです。bhuwansahni源メモリリークをしたくない場合は、メモリをmallocから解放する必要があります。それは非常に扱いにくいことがあります。ある場合、フリーはスキップされ、メモリリークが発生します。++にはshared_ptrがあります。++プログラマーよりも高いという噂があります。ときどきメモリリークに気をつけません。メモリが実行の全期間中必要なものを保持している場合は、解放しないことを選択できます。例:環境変数の文字列。メモリのバグを検出するのに役立つツールです。メモリリークに特に便利です。源いいえ、私たちは単に記憶を正しくクリアすることができます。生涯のために何かを自由にすることを怠ることは、実行の全体が非常に貧しい習慣であることです。Valgrindの出力にエラーが発生します。私たちはそれで生きなければなりません。源コードを書く唯一の人ではなく、ライブラリを使用しないでください。現実は同僚のコードです。依存しているライブラリがメモリを解放していない可能性があります。源さて、あなたはポイントを持っています。私はputenv(strdup(...))のメモリを解放するように同僚に説得するつもりです。私はそれらを働かせようとします。ありがとうございました。