2

free()教育目的で funcを再コーディングする必要があり、名前free()も付ける必要があります。

関数の名前を変更するmyfree()と問題なく動作しますが、名前を付けるとfree()、プログラムは自分の関数を使用する必要があるのか​​システムの関数を使用する必要があるのか​​ わかりませSegmentation fault(core dumped)free()クラッシュします)

では、システムの代わりに私のものを使用するようにコンパイラに指示するにはどうすればよいですか?

よろしくお願いします。

編集:Linuxオペレーティングシステム

4

5 に答える 5

6

基本的に、私が見ることができる3つのオプションがあります

  • #defineたとえば、@Mohamed が提案するように使用して、コンパイル時にリダイレクトします。
  • 実行時にLD_PRELOADを使用して変更します。
  • malloc hooksを使用して、既存の malloc/free を変更します。
于 2013-02-06T11:28:42.487 に答える
6

GCC を使用している場合は、コンパイラを使用できます。コンパイルするとき、これをリンク行に含めます: -Xlinker --wrap=free. これにより、提供する必要があるfree()useへのすべての呼び出しがリダイレクトされます。__wrap_free()元の関数を呼び出したい場合free()、それはまだ存在しますが、名前が変更されます。あなたが呼び出すことができます__real_free()

これにより、リンク先のコンパイル済みライブラリがキャプチャされますが、マクロでは実行できません (ただし、LD_PRELOAD は実行できます)。

于 2013-02-06T11:35:35.550 に答える
1

あなたが標準的な方法を探しているなら、私はそれが存在しないのではないかと思います。標準ライブラリ名の再定義は未定義の動作です。

C11、7.1.3.2:

...プログラムが予約されているコンテキスト(7.1.4で許可されている場合を除く)で識別子を宣言または定義する場合、または予約された識別子をマクロ名として定義する場合、動作は未定義です。

7.1.4には、ライブラリが関数と同じ名前のマクロを定義する方法と、そのマクロをバイパスする方法についての長い説明があります。ユーザーが標準ライブラリ関数をオーバーライドする方法を示すものはありません。

詳細については、この質問も参照してください。

もちろん、他の回答で見つけることができるように、非標準的な方法は常に可能です。

于 2013-02-06T11:34:09.003 に答える
1

そのためにマクロを使用します: プログラムにmyfree()関数を強制的に使用させるには:

#define free(X) myfree(X)
于 2013-02-06T11:23:08.460 に答える
1

最も簡単な (最も安全ではない) 方法は#define free myfree、プリプロセッサがfree()からmyfree( ) へのすべての呼び出しを置き換えるようにすることです。もう 1 つのより安全な方法は、free()という通常の関数を作成し、 free()関数も含むライブラリを含めないことです。

于 2013-02-06T11:28:04.107 に答える