0

次のような大量のfree()関数を実行する代わりに、プログラム内のすべてのメモリを一度に解放する方法があるかどうか疑問に思っていました。

free(somevariable);

それは実際には問題ではありませんが、プログラムに多くの変数が含まれている場合、最後にすべてのメモリを解放するためのキャッチオールがある場合、またはより多くを供給する方法がある場合は、すべての変数に対してそれを行うのはちょっと過剰に思えます一度に1つの変数をfree()にすると、次のようになります。これは非常に役立ちます。ありがとうございます。

free(var1,var2,var3)
4

5 に答える 5

5

free()への呼び出しごとにへの呼び出しが必要ですmalloc()

これは、必ずしもmalloc()ソースコード内の各呼び出しに対応するfree()呼び出しが必要であることを意味するわけではありません。一致する必要があるのは実行時の呼び出しであり、ソースコード内の呼び出しではありません。ただし、通常、ソース呼び出しは一致します。

free()また、すべてのmalloc()edメモリを使用する必要があるわけではないことにも注意してください。プログラムが終了すると、割り当てられたすべてのメモリがオペレーティングシステムに戻されます。(C標準はこれを保証しませんが、使用する可能性のあるすべてのOSがこれを行います。)しかし、自分の後でクリーンアップすることは良い習慣です。たとえば、プログラムはより大きなプログラムの一部になることができます。

于 2012-05-20T00:23:46.660 に答える
1

ここ:

#include <stdlib.h>
#include <stdarg.h>

void vfree(int count, ...) {
        va_list ap;
        int i;

        va_start(ap, count);

        for (i=0; i<count; i++) {
                void *ptr;
                ptr = va_arg(ap, void *);
                printf("arg %d = %p\n", i, ptr);
                free(ptr);
        }

        va_end(ap);
}

次のように呼び出します。

vfree(3, ptr1, ptr2, ptr3);

つまり、ポインターの数を指定してからポインターのリストを指定すると、それらすべてに対して free が呼び出されます。

注意: これはひどいアイデアであり、ひどい実装であり、使用すべきではありません。

于 2012-05-20T00:01:36.477 に答える
1

コンパイラがサポートしている場合__VA_ARGS__(gcc がサポートしており、最新の Visual C++ がサポートしている必要があります)、次のようなことができます。

#include <stdio.h>
#include <stdlib.h>

#define FREE(...) \
  { \
    void* pointers[] = { __VA_ARGS__ }; \
    size_t i; \
    for (i = 0; i < sizeof(pointers) / sizeof(pointers[0]); i++) \
      printf("freeing %p\n", pointers[i]); \
      free(pointers[i]); \
  }

int main(void)
{
  void *p1 = malloc(1), *p2 = malloc(2), *p3 = malloc(3);
  printf("p1=%p, p2=%p, p3=%p\n", p1, p2, p3);
  FREE(p1, p2, p3);
  return 0;
}

出力:

p1=005E17C0, p2=005E17E0, p3=005E17F0
freeing 005E17C0
freeing 005E17E0
freeing 005E17F0
于 2012-05-20T01:23:03.210 に答える
1

ちょっと立ち止まって、何を求めているのかを考えてみてください。意味がありません。終了する直前に「freeall」を呼び出すことが唯一の目的である場合、それは役に立ちません。プログラムを終了すると、メモリ空間全体 (malloc によって行われたすべての割り当てを含む) が存在しなくなります。一方、プログラム終了前の別の時点で「freeall」したい場合は、背後でメモリの割り当てを解除することにより、プログラムにリンクされている可能性のあるすべてのサードパーティ コードに違反しているだけです (どのようにしてコードを知ることができますか)。メモリを解放しますか?)

そうは言っても、あなたが望むものに似たものがあり、それは機能します:talloc:

http://talloc.samba.org/talloc/doc/html/index.html

talloc の考え方は、関連するメモリ割り当てのコンテキストを作成し、talloc_free を 1 回呼び出すだけでそれらをすべて解放できるというものです。これは非常に便利であるだけでなく、割り当て/割り当て解除ロジックを簡素化し、不適切な割り当て解除 (二重解放、リークなど) によるバグの発生を減らすはずです。

于 2012-05-20T04:07:34.067 に答える
0

データ構造のメモリ管理を処理するスマート ポインターが必要です。

編集:- Oli のおかげで、純粋な C の質問に気付きました。スマート ポインターは C++ 構造です。

C では、基本的に、明示的な割り当てごとに空き領域を確保する必要があります。

于 2012-05-20T00:52:54.863 に答える