2012-02-12 13 views
1

私はHashtableが任意の種類の値を保持できるように、値が(void *)である値にキーをマップするHashtable構造体で作業しています。C - passポインタとして事前定義された関数

これらの値を解放できるようにするために、Hashtableのdeconstructorは引数として解放関数へのポインタをとります。私の場合、char *やint *のような基本型を解放するつもりです。 free()関数へのポインタを渡すことは可能ですか?これは基本型を扱うことができるからですか?このような

何か:

FreeHashTable(hashtable_name, free); 
+2

これを試したときに遭遇した問題は何ですか? –

+0

コンパイラのエラーが発生していないようですが、動作していると思いますが、これがFreeHashTableにフリー関数を渡す方法であることを確認したかったのです。言い換えれば、呼び出しは、ローカルで定義された変数がフリーであると期待していませんか? – theeggman85

+0

さて、どうやって知っているのですか?あなたはコードを設計しているので、あなたのコードが期待するものはあなただけです! 2番目の引数を 'void(*)(void *)'にすると、 'free'を含む' FreeHashTable'に関数ポインタを渡すことができます。これは本当にまともなアプローチのようです。 –

答えて

2

あなたは(とすべきである)に関係なく、それが指すどのタイプ(または構造体)、freemallocによって返されたすべてのポインタを渡すことはできません。 ではなく、freeに渡されないように注意してください。あなたはmallocから取得していません。 (配列の中間、ローカル変数など)

一部のデータ型が解放される前に何らかの作業が必要な場合を除き、ポインタを関数に渡すことなく実行できます。freeを呼び出します。

+0

このプログラムはクラス用です。この場合、その型を解放する関数へのポインタを提供することが期待されます。私はすべての型がmallocから来ていると確信していますので、上の行は正しいでしょうか?それは私が関数ポインタで渡すべき方法ですか? – theeggman85

+0

正しいと思われます。 – asaelr

0

ポインタを関数に渡す必要はありません。

値をループしてfreeを呼び出してください。

+0

私は通常これを行いますが、この場合、ハッシュテーブルを解放するこの関数と、個々のペイロードを解放する関数を呼び出す必要があります。別のモジュールがループの作業を行いますが、これは変更できません。 – theeggman85

関連する問題