スコープから外れるとき、Rustはベクタに関連するもの全てを取り除くでしょう。それがヒープ割り当てのメモリであってもです。これはスコープの最後で決定的に起こります。ついては、前のセクションで説明済みですが、簡単に復習しましょう。ここではベクタを、実行時にヒープに空間を割り当てる型の例として用いています。するとサイズが変わるところは違います。ジェネリクスについては、この章の後の方で詳しく説明します。ムーブセマンティクスしかし、ここではもっと些細に見えることがあります。あることを保証するというものです。ベクタがあれば、それを別の束縛に割り当てることはできます。使おうとすると、エラーが出ます。v[0]);こんな感じのエラーです。^もし所有権を受け取る関数を定義して、引数として何かを渡した後でそれを使おうとするならば、同じようなことが起きます。value」という同じエラーです。所有権を何か別のものに転送するとき、参照するものを「ムーブした」と言います。これは特別な種類の注釈なしに行われます。Rustのデフォルトの動作です。束縛をムーブした後で、それを使うことができないと言いました。その理由は、ごく詳細かもしれませんが、とても重要です。ためのメモリを割り当て、そこに、10という値を表すビットパターンをコピーします。後から参照できるよう、変数名xをこのメモリ領域に束縛します。今度は、こんなコード片について考えてみましょう。ために、スタック上にメモリを割り当てます。上にもメモリを割り当てます。スタック上のベクタオブジェクトの中にはポインタがあり、Rustはいま割り当てたヒープのアドレスをそこへコピーします。分かりきっているかもしれませんが、念のためここで確認しておきたいのは、ベクタオブジェクトとそのデータは、それぞれが別のメモリ領域に格納されていることです。それらは、1つの連続したメモリ領域に置かれているわけではありません(その理由についての詳細は、いまは省きます)。ベクタにおけるこれら2つの部分(スタック上のものと、ヒープ上のもの)は、要素数やキャパシティ(容量)などについて、常にお互いの間で一貫性が保たれている必要があります。示すスタック領域へコピーすることです。この浅いコピーでは、実際のデータを格納しているヒープ領域はコピーしません。これは、ベクタの内容として、同一のヒープメモリ領域を指すポインタが2つあることを意味します。これはデータ競合を持ち込むことになり、Rustの安全性保証に違反するでしょう。通して、ベクタを2要素分、切り詰めたとしましょう。ヒープデータが切り詰められたことを知らないので、不正なベクタを提供することになってしまいます。ヒープ上で対応する相手と一貫性が取れていません。アクセスしようとしたら、喜んでそうさせるでしょう。お気づきの通り、特に次のような理由から大惨事に繋がるかもしれません。これはセグメンテーション違反を起こすかもしれませんし、最悪の場合、権限を持たないユーザーが、本来アクセスできないはずのメモリを読めてしまうかもしれないのです。使用を禁止するのです。知っておいてほしいのは、状況によっては最適化により、スタック上のバイトを実際にコピーする処理が省かれる可能性があることです。そのため、ムーブは最初に思ったほど非効率ではないかもしれません。所有権が他の束縛に転送されるとき、元の束縛を使うことができないということを証明しました。