1

ライフと借りたポイントで困っています。マニュアルを読み、ポインターのチュートリアルを借りましたが、まだ行き詰まっています。

のスケッチmain.rs

fn main() {
  let (db_child, repo_child):(DuplexStream<~str, ~str>, DuplexStream<~str, ~str>) = DuplexStream();
    do spawn {
        slurp_repos(&repo_child);
    }
}

のスケッチrepos.rs

fn slurp_repos(chan: &'static DuplexStream<~str, ~str>) {
    ...
    do request.begin |event| {
        ...
        chan.send(api_url);
    }
}

これらのモジュールをコンパイルすると、main.rs に次のエラーが表示されます。

main.rs:21:20: 21:31 error: borrowed value does not live long enough
main.rs:21         slurp_repos(&repo_child);
                               ^~~~~~~~~~~
note: borrowed pointer must be valid for the static lifetime...
main.rs:13:10: 1:0 note: ...but borrowed value is only valid for the block at 13:10
error: aborting due to previous error

DuplexStreams の有効期間を静的に宣言する方法がよくわかりません。あるいは、これは slurp_repos の関数型での間違った方法だったのかもしれません。

完全なコンテキストを表示する場合:

4

1 に答える 1

1

テストすることはできませんが、解決策はrepo_childストリームをに移動することだと思いますslurp_repos。つまり:

fn main() {
  let (db_child, repo_child) = DuplexStream();
    do spawn {
        slurp_repos(repo_child);
    }
}

fn slurp_repos(chan: DuplexStream<~str, ~str>) {
    ...
    do request.begin |event| {
        ...
        chan.send(api_url);
    }
}

エンドポイント全体を移動することで、タスク間で転送できます (aDuplexStreamが可能であるためSend)。また、基本的な双方向ストリームのエンドポイント (参照の使用によって許可されるもの) を共有することは、DuplexStream実際には意味をなさないことに注意してください。電話の両端には 1 人しか存在できません。

repo_child生存期間が不十分であるというエラー メッセージは、 の型がプログラムの存続期間全体にわたって持続slurp_reposするものを必要とするためです。'staticrepo_child

コンパイラが , を付けるように指示する理由は'static、有効な参照はこの有効期間を持つものslurp_reposだけだからです。Sendこの制限が必要なのは、借用タスクが終了する前に所有タスクを終了し、参照を破棄/割り当て解除して、ダングリング ポインターを残す可能性があるためです。図で:

start program/call main
  |
  v
allocate repo_child
  |
  v
spawn -----------------> slurp_repos(chan = &repo_child)
  |                          |
  v                          v
finish                   do things with the chan reference to repo_child
  |                          |
  v                          v
deallocate repo_child    general work ...
                             |
                             v
                         do more things with chan: 
                           oops, already freed; use-after-free bug
于 2013-07-27T14:05:31.303 に答える