それは静的に割り当てられたメモリ(おそらくlocaltime
内で定義されstatic
変数またはどこかCランタイムライブラリで定義されたグローバルのいずれか)の作品へのポインタを返します。私はそれがこのようになります疑い。あなたはそのような記憶を解放してはいけません。
明らかに、この関数はリエントラントではありません(ただし、TLSを使用する場合はスレッドセーフです)。
このポインタを使用するときは注意する必要があります:/ localtime
/gmtime
を呼び出すことができます任意の関数呼び出しを行うことはありません...あなたがそのポインタの使用を終了する前に、そうでない場合は、あなたのポインタが参照するメモリの内容が応答で(変更される可能性がlocaltime
への新規呼び出し)、別のtime_t
との相対的な値が読み取られます。
一般に日付/時刻ライブラリのデザインはかなり時代遅れです。この種の最適化は、C言語の設計時には価値がありました。 localtime_r
(SUSv2では、「リエントラント」のr
滞在)とlocaltime_s
(マイクロソフト、「安全」のためのs
滞在):これらの機能のうちの少なくとも二つの異なる改善のバージョンが存在するこれらの問題に対処するために
。悲しい事実は、移植性のため、これらはほぼ同じことです(パラメータとして渡される宛先はstruct tm
です)が、パラメータの名前と順序が異なります。
あなたのコードには、***構造体***を定義して割り当てます。*** localtime()はその構造体に出力を格納し、同じ構造体へのポインタを返します。これは重複しているように見えるかもしれませんが、構造体がどこにあるのかを知っていても、ポインタを戻すことは時々便利です。 –
@PeteWilson - ええええええええええええ、あなたはありません。以下の回答をご覧ください。あなたが記述しているのは、SUSv2からの '_r'バージョン(' localtime_r() ')やMSVCの' _s'バージョンの場合だけです。 –
[localtime()の返された構造体は、解放される?](http://stackoverflow.com/questions/6210880/does-returned-struct-of-localtime-need-to-be-freed) –