Rust はガベージコレクタを持たない言語だ。コンパイル時に、構造体などのオブジェクトの所有権と生存状態(ライフタイム)を分析することで、オブジェクトを適切なタイミングでメモリから削除する仕組みになっている。この仕組みはとても良くできているが、時々、削除のタイミングを開発者が自分で制御したいこともある。 特にそれが必要になるのが、FFI(他言語関数インターフェイス)経由で、Rust のオブジェクトを他の言語に渡したい時だろう。この場合、他言語にはオブジェクトへのポインタを渡すことになるが、ライフタイムの分析をコンパイラに任せると、Rust の関数を抜けた時にオブジェクトの寿命が尽きたと判断されて、削除されてしまうことがある。これが起こると、他言語に渡したポインタは、参照先のオブジェクトが存在しない状態、いわゆる「ダングリングポインタ」になってしまう。 この記事では簡単な例を使って、ダングリ
前回は、引数や戻り値について、値渡しをしたのだが、今回はポインタを使ってみる。 ポインタを使用する場合、それを表すクラスを使用するのだが、Ruby か Rust のどちらでメモリ領域を確保したかにより、使用するクラスが異なる。 Ruby 側でアロケートしたメモリについては、FFI::MemoryPointer を使用し、Rust 側でアロケートしたメモリについては、FFI::Pointer を使用する。 FFI::MemoryPointer の場合 確保された領域については、Ruby のGC が自動で解放してくれる。 FFI::Pointer 次に、Rust 側でヒープ領域のメモリを確保し、FFI::Pointer を使用して、Ruby 側で参照してみる。 先ほどの、FFI::PointerMemory で、確保され場合と異なり、 Rust 側で確保されたメモリ領域は、GC により解放され
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く