2011-02-10 11 views
1

挨拶、mktemp()のような関数を使用すると、auto-free()はどのように機能しますか?

私はmktemp()(iPhone SDK)を使用しています。この機能は、すべての「X」ランダムな文字に置き換えられ、新しいファイル名にchar *を返します。

私に混乱を招くのは、返される文字列が自動的にfree()であるということです。どのように(そしていつ)それが起こるのですか?私はそれがCocoaのイベントループと関係があるとは思わない。それは自動的にカーネルによって解放されますか?

ありがとうございます!

+1

それは( '' または通常 '' で)利用可能な場合、代わりに 'mkstemp'ご検討ください。通常、 'mkstemp'を呼び出し、' unlink'を呼び出すファイル記述子を返します。これは、特に典型的な 'mktemp'実装が予見可能な名前を返すので、多くの攻撃と競合状態を防ぎます。 –

答えて

2

mktempは、渡したバッファを変更し、渡したのと同じポインタを返します。空きバッファはありません。

それは文字列へのポインタを渡すようPOSIX manpageの例では、間違っていることになりそうだが、((私はIPhoneのためのドキュメントを見つけることができませんでした)OSX manpageはそれを説明し、少なくともどのようだし、POSIXのmanページリテラル - おそらく古いレムナント、関数もレガシーとしてマークされています - 代わりにmkstempを使用してください。

だから、これは何が起こるかです:

char template[] = "/tmp/fooXXXXXX"; 
char *ptr; 
if((ptr = mktemp(template)) == NULL) { 
    assert(ptr == template); //will be true, 
          // mktemp just return the same pointer you pass in 
} 
+0

私はドキュメントのバグにも気付きました。私は渡すポインタを実際に変更するのではなく、代わりに別のポインタを返します。これは基本的に私が混乱していた理由です。返されたポインタを実際に解放する必要はありません。 – BastiBen

+0

@badcat:あなたがまだ納得していない場合は、数回呼び出して、返されたポインタが常に同じかどうかを確認してください:それは私の答えに従って内部の静的バッファであることを確認します。返されるポインタは、あなたが関数を提供しているものと異なっており、マニュアルページを理解しています。入力はファイル名のどこに一意の番号を代入したいかを示すテンプレートです。とにかく、アレクサンドルのコメントはお金にある - 競争状態を避けるほうがいい。 –

2

同じ名前のcygwin関数に似ている場合は、内部の静的文字バッファへのポインタを返します。この静的文字バッファは、次にmktemp()を呼び出すときに上書きされます。 cygwinでは、mktempのmanページには、特に_mktemp_r()と、リエントラントが保証されている同様の関数が記述されており、呼び出し側が提供するバッファが使用されています。

関連する問題