たとえば、次のコードを書くとします。
var t = time_t()
time(&t)
let x = localtime(&t) // returns UnsafeMutablePointer<tm>
println("\(x.memory.tm_hour): \(x.memory.tm_min): \(x.memory.tm_sec)")
...次のことも行う必要がありますか?
x.destroy()
x.dealloc(1)
それとも、メモリを割り当てなかったので、破棄する必要はありませんか?
更新 #1:
を返す関数を想像すると、次のようになりますUnsafeMutablePointer
。
func point() -> UnsafeMutablePointer<String> {
let a = UnsafeMutablePointer<String>.alloc(1)
a.initialize("Hello, world!")
return a
}
この関数を呼び出すと、自分で汚い仕事をしない限り決して破棄されないオブジェクトへのポインタになります。
私がここで尋ねている質問localtime()
:呼び出しから受け取ったポインタは何か違いますか?
シミュレーターとプレイグラウンドの両方dealloc(1)
で、返されたポインターに 1 つの呼び出しを送信することができますが、これを行う必要がありますか?それとも、後で別のメソッドによって返されたポインターの割り当て解除が行われるのでしょうか?
現時点では、破棄して割り当てを解除する必要があるという仮定に誤りがあります。
更新 #1.1:
最後の仮定は間違っていました。オブジェクトを作成していないため、解放する必要はありません。
更新 #2:
Apple dev フォーラムで同じ質問に対する回答をいくつか受け取りました。
一般的に、あなたの質問に対する答えはイエスです。C で解放する責任があるメモリへのポインタを受け取った場合でも、swift から呼び出すときにそれを解放する責任があります... [しかし]この特定のケースでは、何もする必要はありません。(JQ)
ルーチン自体が結果用の静的メモリを維持するため、それらを解放する必要はありません。(そうすると、おそらく「悪いこと」になるでしょう)...一般に、UnsafePointerが指す何かを解放する必要があるかどうかはわかりません....それは、そのポインターがその値を取得する場所によって異なります。(ST)
UnsafePointer の dealloc() は free() と互換性がありません。alloc() と dealloc() および malloc と co をペアにします。free() で。前に指摘したように、呼び出している関数は、結果を解放するための応答であるかどうかを通知する必要があります... destroy() は、ポインターが参照するメモリに重要なコンテンツ* がある場合にのみ必要です。強い参照または Swift 構造体または列挙型。一般に、C からのものであれば、おそらく destroy() する必要はありません。(実際、それは Swift によって初期化されていないため、おそらく destroy() すべきではありません。) ... * 「重要なコンテンツ」は Swift の公式用語ではありません。私はこれを C++ の「自明にコピー可能」という概念との類推で使用しています (ただし、必ずしも「自明」とは限りません)。(ステ)
最終更新:
StackOverflow、Apple Dev Forums、Twitter、およびメモリの割り当てとリリースに関する Apple の古いドキュメント (ARC 以前) からオンボード情報を取得する安全でないポインタのリリースに関する調査結果と仮定の概要を説明するブログ投稿を書きました。ここを参照してください。