sを使用して作成したすべてのポインターによって使用されているメモリを解放するワンライナーはありますmalloc
か?free
または、これはすべてのポインターを個別に実行することによってのみ手動で実行できますか?
6 に答える
これは、mallocの周りにある種の「ラッパー」を作成することで実行できます。(これはアイデアを示す擬似コードにすぎないことを警告します。チェックはまったくありません)
void* your_malloc(size_t size)
{
void* ptr = malloc(size);
// add ptr to a list of allocated ptrs here
return ptr;
}
void your_free(void *pointer)
{
for each pointer in your list
{
free( ptr_in_your_list );
}
}
しかし、それは良い考えのようには思えませんし、少なくとも汎用の割り当て/割り当て解除については、私は確かにそうしません。必要がなくなったら、責任を持ってメモリを割り当てて解放することをお勧めします。
あなたはメモリプールを調べたいと思うかもしれません。これらは、まさにこれを行うために構築されたデータ構造です。
一般的な実装の1つは、 ApacheWebサーバーで使用されるApachePortable Runtimeや、Subversionなどの他のプロジェクトです。
malloc
それ自体に実装定義の動作があります。したがって、それが持っているすべてのポインタを追跡する必要はありません。これは明らかにアイデアにダンパーを置きます。
ポインタを追跡する独自のメモリマネージャを作成する必要があります。次に、呼び出される関数、free_all
またはポインタのリストを調べてfree
それらを呼び出す関数を提供します。
これはやや悪い考えのように聞こえることに注意してください。free
あなたのメモリ使用量、そしてあなたが終わったときのことについてもう少し厳格/責任がある方が良いです。それらをぶら下げたままにしないでください。
おそらく、あなたがあなたのアイデアをどこに適用したいかについてもう少し背景があれば、私たちはより簡単な解決策を見つけるかもしれません。
dlmalloc を確認する
ftp://g.oswego.edu/pub/misc/malloc.h
次の関数を見てください
/*
mspace is an opaque type representing an independent
region of space that supports mspace_malloc, etc.
*/
typedef void* mspace;
/*
create_mspace creates and returns a new independent space with the
given initial capacity, or, if 0, the default granularity size. It
returns null if there is no system memory available to create the
space. If argument locked is non-zero, the space uses a separate
lock to control access. The capacity of the space will grow
dynamically as needed to service mspace_malloc requests. You can
control the sizes of incremental increases of this space by
compiling with a different DEFAULT_GRANULARITY or dynamically
setting with mallopt(M_GRANULARITY, value).
*/
mspace create_mspace(size_t capacity, int locked);
/*
destroy_mspace destroys the given space, and attempts to return all
of its memory back to the system, returning the total number of
bytes freed. After destruction, the results of access to all memory
used by the space become undefined.
*/
size_t destroy_mspace(mspace msp);
...
/*
The following operate identically to their malloc counterparts
but operate only for the given mspace argument
*/
void* mspace_malloc(mspace msp, size_t bytes);
void mspace_free(mspace msp, void* mem);
void* mspace_calloc(mspace msp, size_t n_elements, size_t elem_size);
void* mspace_realloc(mspace msp, void* mem, size_t newsize);
「アリーナ割り当て」と呼ばれるものを実行することをお勧めします。この場合、共通の「アリーナ」から特定の要求を割り当てます。これは、完了したら一度に解放できます。
Windowsを使用している場合は、HeapCreateを使用してアリーナを作成し、HeapAllocを使用して作成したヒープ/アリーナからメモリを取得し、HeapDestroyを使用して一度にすべてを解放できます。
プログラムがexit()すると、malloc()で割り当てたすべてのメモリが解放されることに注意してください。
はい、との独自の定義を書かない限り、それを行うことができmalloc()
ますfree()
。myCustomMalloc()
通常の代わりに呼び出すmalloc()
必要があり、メモリ位置にあるすべてのポインタを追跡する必要があります。myCustomFree()
メソッドを呼び出すと、を使用して作成されたすべてのポインタをクリアできるはずですmyCustomMalloc()
。注:カスタムメソッドは、内部malloc()
とfree()
内部の両方で呼び出されます
このようにして、あなたはあなたの目標を達成することができます。私はJavaの人ですが、初期の頃はCでよく働いていました。私はあなたがメモリがコンパイラによって処理されている一般的な解決策を達成しようとしていると思います。これには、Javaで見られるようにパフォーマンスのコストがかかります。割り当てやメモリの解放について心配する必要はありません。しかし、それはパフォーマンスに深刻な影響を及ぼします。それはあなたが一緒に暮らさなければならないトレードオフです。