Improving C# Memory Safety
https://devblogs.microsoft.com/dotnet/improving-csharp-memory-safety/
C# 16、メモリ安全性を強化する新たなunsafeモデルを導入へ
https://codezine.jp/news/detail/24314
C#が新unsafeでメモリ安全に Rust/Swiftへの言及も
1デフォルトの名無しさん
2026/05/24(日) 23:12:01.01ID:Q/0ls4UZ2026/07/07(火) 06:05:40.12ID:+R9WRXbp
>>29
それはRAIIの理解不足
RAIIはブロックなどのローカルスコープで宣言したものはそのスコープを抜ける時にも存在していれば自動的にそのリソースが解放される自動管理の仕組み
ただしそこへの参照が残っていれば自動解放されるとダングリンク参照になってしまい危険
Rustはコンパイラが参照連鎖も静的にチェックするため必ずそれを防いでくれるため実用的な自動管理になった
一方でそれらの機構のないGC言語ではローカルスコープを抜けても自動的にそのリソースを解放していいのかわからない
そこへの参照が残っているのか実行前に静的にコンパイル時点で判断できないためだ
だから定期的に参照連鎖を実行時に動的にチェックするガベージコレクション(GC)が必要になる
そして実行時に参照連鎖を追えるようにするためのコストの高いメモリ管理をせざるを得ない
それゆえGC言語は実行が遅くなるだけでなくGC発動まで無駄にメモリを占有してしまう
それはRAIIの理解不足
RAIIはブロックなどのローカルスコープで宣言したものはそのスコープを抜ける時にも存在していれば自動的にそのリソースが解放される自動管理の仕組み
ただしそこへの参照が残っていれば自動解放されるとダングリンク参照になってしまい危険
Rustはコンパイラが参照連鎖も静的にチェックするため必ずそれを防いでくれるため実用的な自動管理になった
一方でそれらの機構のないGC言語ではローカルスコープを抜けても自動的にそのリソースを解放していいのかわからない
そこへの参照が残っているのか実行前に静的にコンパイル時点で判断できないためだ
だから定期的に参照連鎖を実行時に動的にチェックするガベージコレクション(GC)が必要になる
そして実行時に参照連鎖を追えるようにするためのコストの高いメモリ管理をせざるを得ない
それゆえGC言語は実行が遅くなるだけでなくGC発動まで無駄にメモリを占有してしまう
2026/07/09(木) 22:33:58.85ID:t5kHx157
>>31
やっぱり自動管理の意味がわかってないじゃん
コンピュータが最終的な処理をやるから自動だと言ってるなら手動管理なんか存在しないからお前の言ってることはおかしいし、そうじゃないなら自動管理だから自動管理なんだ!って言ってるだけでただ自分の決めつけを押し付けたいだけ
GCがリソースの解放を静的に判断できないという点だけは正しいが、だからランタイムが自動解放するという点を理解してないので後半の説明も片手落ち
やっぱり自動管理の意味がわかってないじゃん
コンピュータが最終的な処理をやるから自動だと言ってるなら手動管理なんか存在しないからお前の言ってることはおかしいし、そうじゃないなら自動管理だから自動管理なんだ!って言ってるだけでただ自分の決めつけを押し付けたいだけ
GCがリソースの解放を静的に判断できないという点だけは正しいが、だからランタイムが自動解放するという点を理解してないので後半の説明も片手落ち
2026/07/09(木) 22:36:23.10ID:t5kHx157
2026/07/09(木) 23:16:50.91ID:nhcPk2TR
>>32
関数やブロックを抜けると自動解放されるRAIIは自動管理そのもの
自動解放タイミングも明瞭かつ直ちに行われて分かりやすく省メモリ
GCも自動解放だがタイミングが不明瞭で遅延が大きく分かりにくくメモリ使用量肥大
関数やブロックを抜けると自動解放されるRAIIは自動管理そのもの
自動解放タイミングも明瞭かつ直ちに行われて分かりやすく省メモリ
GCも自動解放だがタイミングが不明瞭で遅延が大きく分かりにくくメモリ使用量肥大
2026/07/09(木) 23:20:02.33ID:t5kHx157
>>34
それを自動管理と言うなら「free()があれば自動解放されるC言語は自動管理そのもの」ということになる
それを自動管理と言うなら「free()があれば自動解放されるC言語は自動管理そのもの」ということになる
36デフォルトの名無しさん
2026/07/09(木) 23:23:34.90ID:4ETC4bN52026/07/09(木) 23:27:18.09ID:t5kHx157
2026/07/09(木) 23:29:47.99ID:t5kHx157
ついでに言えば、所有権システムもプログラマが自らの意思で矛盾なく設計しなければ成立しない
39デフォルトの名無しさん
2026/07/09(木) 23:30:20.84ID:4ETC4bN5 RAIIはプログラマの意思と関係なく自動的に行われる
スコープを抜ける時にプログラマの意思と関係なく自動的にデストラクタが呼ばれる
スコープを抜ける時にプログラマの意思と関係なく自動的にデストラクタが呼ばれる
2026/07/09(木) 23:35:14.07ID:VR6ODDSK
同じ自動管理でも発動時期が読めないGCより即座に実行されるRAIIが優れているね
41デフォルトの名無しさん
2026/07/09(木) 23:45:45.47ID:xJ9qw/+T 自動管理の言葉の定義で争う無能達
2026/07/09(木) 23:47:09.76ID:t5kHx157
2026/07/09(木) 23:47:46.70ID:t5kHx157
>>41
根本的に理解が足りてないんだろうね
根本的に理解が足りてないんだろうね
2026/07/09(木) 23:49:50.97ID:DugaDw0j
RAIIで自動的にメモリが解放されるRustは両者どちらの定義でも自動管理になるよ
45デフォルトの名無しさん
2026/07/09(木) 23:50:57.48ID:xJ9qw/+T >>43
一番の無能が話しかけないでくれるかな?
一番の無能が話しかけないでくれるかな?
46デフォルトの名無しさん
2026/07/09(木) 23:57:55.81ID:4ETC4bN52026/07/09(木) 23:58:32.98ID:t5kHx157
2026/07/09(木) 23:59:13.02ID:t5kHx157
>>46
RAIIとARCの区別がついていないんじゃないか?
RAIIとARCの区別がついていないんじゃないか?
49デフォルトの名無しさん
2026/07/10(金) 00:01:26.98ID:bAT5n0dl50デフォルトの名無しさん
2026/07/10(金) 00:06:57.93ID:YH4Bmk9y めっちゃ話は単純
RAIIやGCのようにプログラマーの意思と無関係に必ず自動的に実行されると自動管理
free()のようにプログラマの意思で行なうと手動管理
RAIIやGCのようにプログラマーの意思と無関係に必ず自動的に実行されると自動管理
free()のようにプログラマの意思で行なうと手動管理
2026/07/10(金) 00:22:53.35ID:bAT5n0dl
2026/07/10(金) 00:26:51.78ID:Et4y/no6
少なくともRustのRAIIにプログラマーの指定箇所はないね
完全自動になってる
完全自動になってる
2026/07/10(金) 02:27:59.29ID:bAT5n0dl
>>52
RustのRAIIも所有権やライフタイムを明示的に扱わないと機能しないね
RustのRAIIも所有権やライフタイムを明示的に扱わないと機能しないね
2026/07/10(金) 02:39:18.25ID:Dd4gMTqK
>>53
RustでもRAIIはそれらと一切無関係に動作しますよ
RustでもRAIIはそれらと一切無関係に動作しますよ
2026/07/10(金) 03:24:59.62ID:bAT5n0dl
2026/07/10(金) 03:26:07.22ID:bAT5n0dl
やったことないから無関係だと信じてられるんだよw
流石に笑っちまうわww
流石に笑っちまうわww
57デフォルトの名無しさん
2026/07/10(金) 23:45:35.47ID:6bLhCPPM C→C++になってRAIIが導入されて更に手動でunique_ptrを指定すれぱ自動解放できるようになった
ただし参照が残っていればそれは解放後にダングリング参照になってしまう危険なリスクはそのまま
C++→RustになってRAIIにより常に自動解放されるようになった
参照が残らないことも保証されるため安全に自動解放されるようになった
ただし参照が残っていればそれは解放後にダングリング参照になってしまう危険なリスクはそのまま
C++→RustになってRAIIにより常に自動解放されるようになった
参照が残らないことも保証されるため安全に自動解放されるようになった
2026/07/11(土) 03:31:48.38ID:EKW8EhdF
>>57
Rustはあくまでコンパイラがコードに問題がないことを保証することと、RAIIを標準にすることをやっているだけで、メモリの管理は相変わらずプログラマがやらなくてはいけないことに変わりはないので
Rustはあくまでコンパイラがコードに問題がないことを保証することと、RAIIを標準にすることをやっているだけで、メモリの管理は相変わらずプログラマがやらなくてはいけないことに変わりはないので
59デフォルトの名無しさん
2026/07/11(土) 12:09:11.44ID:uV5Zny+82026/07/11(土) 14:20:38.48ID:EKW8EhdF
>>59
話が逸れてる
話が逸れてる
61デフォルトの名無しさん
2026/07/11(土) 21:58:11.86ID:hjNCA0gY RAIIが自動管理は草
RAIIなんかプログラマがシコシコメモリ管理するのを何とかデストラクタ使って頑張ってるだけのこと
RAIIなんかプログラマがシコシコメモリ管理するのを何とかデストラクタ使って頑張ってるだけのこと
2026/07/11(土) 23:05:59.21ID:EKW8EhdF
RAIIを自動管理だと思ってる奴、deferも自動管理だと思ってそう
メモリ管理ちゃんと意識したことないんだろうな
メモリ管理ちゃんと意識したことないんだろうな
63デフォルトの名無しさん
2026/07/12(日) 01:31:32.02ID:SwxS5pWs プログラマーが明示的に指定しなければいけないと手動管理
プログラマが指定する必要がないと自動管理
deferは手動管理
C++のRAIIは手動管理
RustのRAIIは自動管理
プログラマが指定する必要がないと自動管理
deferは手動管理
C++のRAIIは手動管理
RustのRAIIは自動管理
2026/07/12(日) 03:17:05.34ID:MVcsLvMp
2026/07/13(月) 08:53:16.92ID://w25X3S
日常RustメインだがRustは自動解放だから楽勝
管理なんてなくて普通の言語と同じ
関数に引き数として渡すか永続変数に入れておくかの二択しかない
管理なんてなくて普通の言語と同じ
関数に引き数として渡すか永続変数に入れておくかの二択しかない
66デフォルトの名無しさん
2026/07/13(月) 13:29:31.92ID:CAt/1il7 >>65
線形リスト作ってみいや
線形リスト作ってみいや
2026/07/13(月) 14:54:46.91ID:5sH5Cvg8
>>65
ゴミのようなコードが見える見える
ゴミのようなコードが見える見える
2026/07/13(月) 15:19:18.21ID:v1sglfs5
線形リストが使われなくなった理由は他のデータ構造を用いる方が速いとはっきりしたから
辿ること自体が遅いのに加えてメモリキャッシュを活かせないことが敗因
売りポイントの挿入削除もその地点を探すのにO(n)かかって不利でその地点が既知なら他のデータ構造が速い
唯一生き残っている線形リストの使われ方はマルチスレッドにおけるキュー管理で唯一ロックフリーにすることができる
複雑に改良が積み重ねられてきた歴史があるためライブラリの助けを借りるのが良い
というわけで専門家以外が線形リストをプログラミングすることはなくなった
辿ること自体が遅いのに加えてメモリキャッシュを活かせないことが敗因
売りポイントの挿入削除もその地点を探すのにO(n)かかって不利でその地点が既知なら他のデータ構造が速い
唯一生き残っている線形リストの使われ方はマルチスレッドにおけるキュー管理で唯一ロックフリーにすることができる
複雑に改良が積み重ねられてきた歴史があるためライブラリの助けを借りるのが良い
というわけで専門家以外が線形リストをプログラミングすることはなくなった
2026/07/13(月) 16:03:13.43ID:4oZSYmaV
ブロックチェーンという双方向リストで息をふきかえした
線形リストはデータ構造へと昇華したのだ
線形リストはデータ構造へと昇華したのだ
2026/07/13(月) 16:13:31.28ID:k3Rg0Tja
ブロックチェーンで線形リストは使われない
巨大なチェーンを一つずつ辿っていたら遅すぎて実用にならないためハッシュマップが使われている
巨大なチェーンを一つずつ辿っていたら遅すぎて実用にならないためハッシュマップが使われている
2026/07/13(月) 16:55:20.44ID:t84CL3Vg
>>67
それ以外の方法があるなら具体的に述べなさい
それ以外の方法があるなら具体的に述べなさい
2026/07/13(月) 20:16:04.36ID:5sH5Cvg8
2026/07/13(月) 21:36:41.40ID:Ll/Q1aqG
>>72
Rustに詳しくない様だから教えてあげるね
Rustはムーブが基本なのよ
例えばaからbへの代入文 b = a があった時
言語によってはディープコピーするもの
シャローコピーするもの
特に一番浅い参照コピーするもの
それらが状況や型によって変わるもの
など多種多様なのはご存知よね
Rustはそれが基本動作としてムーブになるというだけよ
そして数値などプリミティブな型はコピー属性を持っていてムーブの文脈で代わりにコピーになるのよ
これらの基本動作は自然に行われるから安心してね
Rustに詳しくない様だから教えてあげるね
Rustはムーブが基本なのよ
例えばaからbへの代入文 b = a があった時
言語によってはディープコピーするもの
シャローコピーするもの
特に一番浅い参照コピーするもの
それらが状況や型によって変わるもの
など多種多様なのはご存知よね
Rustはそれが基本動作としてムーブになるというだけよ
そして数値などプリミティブな型はコピー属性を持っていてムーブの文脈で代わりにコピーになるのよ
これらの基本動作は自然に行われるから安心してね
2026/07/13(月) 22:00:52.06ID://w25X3S
>>72
可変参照と不変参照の区別がある言語は増えているけど管理とはなんの話だろう
可変参照と不変参照の区別がある言語は増えているけど管理とはなんの話だろう
2026/07/14(火) 14:17:20.96ID:/b2uC2Vr
2026/07/14(火) 14:17:48.75ID:/b2uC2Vr
2026/07/14(火) 14:46:20.59ID:/b2uC2Vr
2026/07/14(火) 15:41:22.77ID:Mw+1/AR/
79デフォルトの名無しさん
2026/07/14(火) 15:48:21.96ID:00K5fea0 別に当たり前ではないたろ
線型論理は別に唯一の論理ではない
線型論理は別に唯一の論理ではない
2026/07/14(火) 16:50:35.36ID:/b2uC2Vr
2026/07/14(火) 17:52:48.25ID:Mw+1/AR/
2026/07/14(火) 20:26:11.68ID:iZ1BaTzv
2026/07/14(火) 22:52:16.52ID:/b2uC2Vr
2026/07/14(火) 22:53:31.37ID:/b2uC2Vr
まあ、実を言うと「なんでバレないと思ったのか」じゃなくて「やったことないから知らない」なのはバレてるけどな
一生懸命ID二つ使って抵抗してるとこ悪いけど、普通にここまで無知を露呈したらごまかしきかないからあきらめた方がいいぞ
一生懸命ID二つ使って抵抗してるとこ悪いけど、普通にここまで無知を露呈したらごまかしきかないからあきらめた方がいいぞ
2026/07/14(火) 23:41:43.58ID:Mw+1/AR/
86デフォルトの名無しさん
2026/07/14(火) 23:53:39.10ID:Ue5AUbKn ライフタイム注釈の有無に関係なくID:/b2uC2Vrが間違ってるでしょ
関数の引数で受け取った参照は関数の返り値として返せるという当たり前の話をID:/b2uC2Vrは否定しているのだから
関数の引数で受け取った参照は関数の返り値として返せるという当たり前の話をID:/b2uC2Vrは否定しているのだから
2026/07/15(水) 02:02:05.49ID:PFPK0g3k
2026/07/15(水) 02:04:00.74ID:PFPK0g3k
つまりお前な
「Rustはメモリ管理する必要ないし普通の言語みたいに参照できる」とかいうバカげた主張をしたのが悪いのに、無理に自分が正しいと言い張るために相手の発言を捏造し始める、そういうところやぞと
「Rustはメモリ管理する必要ないし普通の言語みたいに参照できる」とかいうバカげた主張をしたのが悪いのに、無理に自分が正しいと言い張るために相手の発言を捏造し始める、そういうところやぞと
2026/07/15(水) 02:26:07.42ID:PFPK0g3k
>>86
「ライフタイムの制約を受ける」を「返せない」と言った時点で控えめに見積もってもRustを書いたことがないのはわかりきってるから、もう二度とこの話に口を出さない方がいい
「ライフタイムの制約を受ける」を「返せない」と言った時点で控えめに見積もってもRustを書いたことがないのはわかりきってるから、もう二度とこの話に口を出さない方がいい
2026/07/16(木) 16:18:45.57ID:Wb6p8Q0G
The Bookくらいは読んでから話せって話よな
ライフタイムなんて中盤で出てくる程度の要素だぞ
ライフタイムなんて中盤で出てくる程度の要素だぞ
91デフォルトの名無しさん
2026/07/16(木) 19:54:49.27ID:86x3Bz3M2026/07/16(木) 22:28:15.46ID:tqJQMSog
>>91
なんでわざわざもう一回バカ晒しに来たんだ?
ライフタイムで参照を検証する - The Rust Programming Language 日本語版
https://doc.rust-jp.rs/book-ja/ch10-03-lifetime-syntax.html
このタイトル、読める?w
> ライフタイム省略
> 全参照にはライフタイムがあり、参照を使用する関数や構造体にはライフタイム引数を指定する必要があることを学びました。
まだわかんない?ww
なんでわざわざもう一回バカ晒しに来たんだ?
ライフタイムで参照を検証する - The Rust Programming Language 日本語版
https://doc.rust-jp.rs/book-ja/ch10-03-lifetime-syntax.html
このタイトル、読める?w
> ライフタイム省略
> 全参照にはライフタイムがあり、参照を使用する関数や構造体にはライフタイム引数を指定する必要があることを学びました。
まだわかんない?ww
2026/07/16(木) 22:29:04.72ID:tqJQMSog
どう考えてもバカにされてるのは「ライフタイムの制約を受ける」を「返せない」と解釈するお前だぞw
2026/07/16(木) 22:34:58.06ID:5AWdp3FM
引数で受け取った参照がどんなライフタイムだったとしても関数は常にその参照や派生参照を返すことができるのよ
だからRustプログラマーが困ることはないです
だからRustプログラマーが困ることはないです
2026/07/16(木) 22:40:58.72ID:tqJQMSog
>>94
また嘘が飛び出したな
「Rustはメモリ安全を保証するので、参照の寿命は本体のそれを超えない」
↑ これの意味がわからないレベルなら、Rust どころか C / C++ すらまともに書いたことがないのがバレます
再度繰り返すが、Rustはメモリ安全を保証するので、参照の寿命は本体のそれを超えない
なので、
> どんなライフタイムだったとしても関数は常にその参照や派生参照を返すことができる
は大嘘で、'static でないと返せない関数も普通に発生する
Rustプログラマにとって最も難所となるのがこの参照のライフタイムであって、マルチスレッド設計が難しい理由である
また、RcやArcなどの参照カウント式の管理が、標準ライブラリに組み込まれている理由でもある
……ここまでのことは、Rustを書いていればThe Bookにも書いてある「常識」なのだが、これがわからない自称「Rustプログラマー」は何を書いてきたんだろうね?
また嘘が飛び出したな
「Rustはメモリ安全を保証するので、参照の寿命は本体のそれを超えない」
↑ これの意味がわからないレベルなら、Rust どころか C / C++ すらまともに書いたことがないのがバレます
再度繰り返すが、Rustはメモリ安全を保証するので、参照の寿命は本体のそれを超えない
なので、
> どんなライフタイムだったとしても関数は常にその参照や派生参照を返すことができる
は大嘘で、'static でないと返せない関数も普通に発生する
Rustプログラマにとって最も難所となるのがこの参照のライフタイムであって、マルチスレッド設計が難しい理由である
また、RcやArcなどの参照カウント式の管理が、標準ライブラリに組み込まれている理由でもある
……ここまでのことは、Rustを書いていればThe Bookにも書いてある「常識」なのだが、これがわからない自称「Rustプログラマー」は何を書いてきたんだろうね?
96デフォルトの名無しさん
2026/07/16(木) 22:50:59.88ID:cwi1cuXm2026/07/16(木) 22:56:29.40ID:tqJQMSog
>>96
ずっと言ってるけどはっきり否定できる、とてもわかりやすい間違い
パッと思いついただけでも複数の参照を受け取る関数や、コールバック関数などは参照をそのまま返すことはできないし、他のスレッドに行く場合も当然無理だね
ずっと言ってるけどはっきり否定できる、とてもわかりやすい間違い
パッと思いついただけでも複数の参照を受け取る関数や、コールバック関数などは参照をそのまま返すことはできないし、他のスレッドに行く場合も当然無理だね
2026/07/16(木) 22:59:36.84ID:tqJQMSog
> Rustはメモリ安全を保証するので、参照の寿命は本体のそれを超えない
ここからは、これがわからない Rust / C++ / C などの未経験者向けの解説
参照とはそもそも、ここに本体はなく本体の場所や型などの情報だけを受け取っておいて、実際にはその本体を読み書きする、いわば「Windowsのショートカットファイル」のような存在と言える
これを使うのは、本体を都度コピーしていてはメモリも無駄に使うし遅くなる、それに本体を共有すればコピーと違って値が見る者によって変わってしまう心配がないという特徴があるからだ
さて、Rustの大きな特徴である「メモリ安全」の一部分として、「『もう本体がなくなった後の場所を読み書きする』ことの禁止」というものがある
しかし、参照は本体を読み書きするためのものなので、当然本体より長生きすることがあれば「もう本体がなくなった後の場所を読み書きする」ことになってしまう
なので、Rustには「ライフタイム」という概念があって、参照の寿命が本体のそれを超えていないか、確認する仕組みになっているんだね
ここからは、これがわからない Rust / C++ / C などの未経験者向けの解説
参照とはそもそも、ここに本体はなく本体の場所や型などの情報だけを受け取っておいて、実際にはその本体を読み書きする、いわば「Windowsのショートカットファイル」のような存在と言える
これを使うのは、本体を都度コピーしていてはメモリも無駄に使うし遅くなる、それに本体を共有すればコピーと違って値が見る者によって変わってしまう心配がないという特徴があるからだ
さて、Rustの大きな特徴である「メモリ安全」の一部分として、「『もう本体がなくなった後の場所を読み書きする』ことの禁止」というものがある
しかし、参照は本体を読み書きするためのものなので、当然本体より長生きすることがあれば「もう本体がなくなった後の場所を読み書きする」ことになってしまう
なので、Rustには「ライフタイム」という概念があって、参照の寿命が本体のそれを超えていないか、確認する仕組みになっているんだね
2026/07/16(木) 23:01:47.71ID:tqJQMSog
だから、ある関数に参照を渡して、その関数がまた参照を返すといったような動きをした場合、この返された参照のライフタイムが問題になる
当然、この返された参照は、この関数の中の変数は指していない
なぜなら、この関数が終わった時点でこの関数の中の変数は解放されてしまうから、それが返せてしまうと「もう本体がなくなった後の場所を読み書きする」ことになるからなんだ
じゃあ、ある関数が返す参照は、受け取った参照であるということになる
その時、たとえば関数が複数の参照を受け取っていたとして、Rustのコンパイラは関数の境界で追跡を止めるようになっているから、呼び出している側からは渡したどの参照が返ってきているのかわからない
しかし、複数の本体のライフタイムは必ずしも一致しているとは限らない(他の関数から借りている参照かもしれないし、一部の変数だけ drop() されてしまうかもしれない)ので、どの参照が返ってきているのかわからないということは、そのまま返ってきた参照のライフタイムがわからないことを意味してしまう
これがわからないままでは、「『もう本体がなくなった後の場所を読み書きする』こと」が防げなくなってしまうので、メモリ安全ではなくなってしまうんだ
だから、これはライフタイム注釈をつけてあげないと返せないことになっているし、そのライフタイムを超えて生き残る可能性がある関数には、渡すことができないことも決まっているんだ
つまり、Rustの参照は全て、ライフタイムの制約を受けているんだね
当然、この返された参照は、この関数の中の変数は指していない
なぜなら、この関数が終わった時点でこの関数の中の変数は解放されてしまうから、それが返せてしまうと「もう本体がなくなった後の場所を読み書きする」ことになるからなんだ
じゃあ、ある関数が返す参照は、受け取った参照であるということになる
その時、たとえば関数が複数の参照を受け取っていたとして、Rustのコンパイラは関数の境界で追跡を止めるようになっているから、呼び出している側からは渡したどの参照が返ってきているのかわからない
しかし、複数の本体のライフタイムは必ずしも一致しているとは限らない(他の関数から借りている参照かもしれないし、一部の変数だけ drop() されてしまうかもしれない)ので、どの参照が返ってきているのかわからないということは、そのまま返ってきた参照のライフタイムがわからないことを意味してしまう
これがわからないままでは、「『もう本体がなくなった後の場所を読み書きする』こと」が防げなくなってしまうので、メモリ安全ではなくなってしまうんだ
だから、これはライフタイム注釈をつけてあげないと返せないことになっているし、そのライフタイムを超えて生き残る可能性がある関数には、渡すことができないことも決まっているんだ
つまり、Rustの参照は全て、ライフタイムの制約を受けているんだね
100デフォルトの名無しさん
2026/07/16(木) 23:04:10.92ID:tqJQMSog C / C++ などにはこの「ライフタイム」というシステムがないので、参照(Cであればポインタが指すアドレス)がいつまで生きているか、検証のしようがないんだ
これが「ダングリングポインタ」と呼ばれるもので、プログラムをクラッシュさせたり、データを破壊したり、場合によっては脆弱性の原因にもなってしまうんだね
だから、C / C++ から Rust に移行しよう、という話になっているんだよ
これが「ダングリングポインタ」と呼ばれるもので、プログラムをクラッシュさせたり、データを破壊したり、場合によっては脆弱性の原因にもなってしまうんだね
だから、C / C++ から Rust に移行しよう、という話になっているんだよ
101デフォルトの名無しさん
2026/07/16(木) 23:04:33.29ID:cwi1cuXm 正しい事実はこれ
「Rustはあらゆる寿命の参照について
引数として受け取った関数はそれを常に安全に返すことができる」
反例を出せない初心者クンID:tqJQMSogの間違いが確定
「Rustはあらゆる寿命の参照について
引数として受け取った関数はそれを常に安全に返すことができる」
反例を出せない初心者クンID:tqJQMSogの間違いが確定
102デフォルトの名無しさん
2026/07/16(木) 23:07:12.70ID:tqJQMSog どうだったかな
Rustの参照は安全のためにライフタイムの制約を受けること、これがない C / C++ ではダングリングポインタの危険性があること
たぶん、プログラミングの経験がある程度あれば、Rust / C++ / C を書いたことがなくても、わかったんじゃないかな
……なので、
> Rustは関数が引数で受け取った参照を常に関数の返り値として返すことができる
> ライフタイムによる制約はない
> Rustはあらゆる寿命の参照について
> 引数として受け取った関数はそれを常に安全に返すことができる
というのは大間違いなんだね!
Rustの参照は安全のためにライフタイムの制約を受けること、これがない C / C++ ではダングリングポインタの危険性があること
たぶん、プログラミングの経験がある程度あれば、Rust / C++ / C を書いたことがなくても、わかったんじゃないかな
……なので、
> Rustは関数が引数で受け取った参照を常に関数の返り値として返すことができる
> ライフタイムによる制約はない
> Rustはあらゆる寿命の参照について
> 引数として受け取った関数はそれを常に安全に返すことができる
というのは大間違いなんだね!
103デフォルトの名無しさん
2026/07/16(木) 23:10:48.40ID:tqJQMSog104デフォルトの名無しさん
2026/07/16(木) 23:12:36.87ID:tqJQMSog105デフォルトの名無しさん
2026/07/16(木) 23:14:12.34ID:tqJQMSog C / C++ を書いていれば、
メモリ安全
→ ダングリングポインタは禁止
→ 参照は無条件では返せない
ここまではRustを書いた経験がなくてもわかるよねw
メモリ安全
→ ダングリングポインタは禁止
→ 参照は無条件では返せない
ここまではRustを書いた経験がなくてもわかるよねw
106デフォルトの名無しさん
2026/07/16(木) 23:15:56.02ID:tqJQMSog この程度のことすらわからない時点で、ID:cwi1cuXm(ID:86x3Bz3M, ID:Ue5AUbKn, ID:iZ1BaTzv, ID:Mw+1/AR/, ID://w25X3S)は
* システムプログラミング
* メモリ安全
* Rust
* 借用
* ライフタイム
のどれもわかっていないことが確定しました
* システムプログラミング
* メモリ安全
* Rust
* 借用
* ライフタイム
のどれもわかっていないことが確定しました
107デフォルトの名無しさん
2026/07/16(木) 23:24:55.48ID:+qjQFMRo Rustプログラマーなら誰でもわかる常識をID:tqJQMSogが言い掛かり付けてる理由を知りたい
>> 「Rustはあらゆる寿命の参照について
>> 引数として受け取った関数はそれを常に安全に返すことができる」
これは誰が見ても当たり前で正しいとわかるじゃん
>> 「Rustはあらゆる寿命の参照について
>> 引数として受け取った関数はそれを常に安全に返すことができる」
これは誰が見ても当たり前で正しいとわかるじゃん
108デフォルトの名無しさん
2026/07/16(木) 23:25:46.42ID:tqJQMSog > Rustはメモリ安全を保証するので、参照の寿命は本体のそれを超えない
ここからは、これがわからない Rust / C++ / C などの未経験者向けの解説
参照とはそもそも、ここに本体はなく本体の場所や型などの情報だけを受け取っておいて、実際にはその本体を読み書きする、いわば「Windowsのショートカットファイル」のような存在と言える
これを使うのは、本体を都度コピーしていてはメモリも無駄に使うし遅くなる、それに本体を共有すればコピーと違って値が見る者によって変わってしまう心配がないという特徴があるからだ
さて、Rustの大きな特徴である「メモリ安全」の一部分として、「『もう本体がなくなった後の場所を読み書きする』ことの禁止」というものがある
しかし、参照は本体を読み書きするためのものなので、当然本体より長生きすることがあれば「もう本体がなくなった後の場所を読み書きする」ことになってしまう
なので、Rustには「ライフタイム」という概念があって、参照の寿命が本体のそれを超えていないか、確認する仕組みになっているんだね
だから、ある関数に参照を渡して、その関数がまた参照を返すといったような動きをした場合、この返された参照のライフタイムが問題になる
当然、この返された参照は、この関数の中の変数は指していない
なぜなら、この関数が終わった時点でこの関数の中の変数は解放されてしまうから、それが返せてしまうと「もう本体がなくなった後の場所を読み書きする」ことになるからなんだ
じゃあ、ある関数が返す参照は、受け取った参照であるということになる
その時、たとえば関数が複数の参照を受け取っていたとして、Rustのコンパイラは関数の境界で追跡を止めるようになっているから、呼び出している側からは渡したどの参照が返ってきているのかわからない
ここからは、これがわからない Rust / C++ / C などの未経験者向けの解説
参照とはそもそも、ここに本体はなく本体の場所や型などの情報だけを受け取っておいて、実際にはその本体を読み書きする、いわば「Windowsのショートカットファイル」のような存在と言える
これを使うのは、本体を都度コピーしていてはメモリも無駄に使うし遅くなる、それに本体を共有すればコピーと違って値が見る者によって変わってしまう心配がないという特徴があるからだ
さて、Rustの大きな特徴である「メモリ安全」の一部分として、「『もう本体がなくなった後の場所を読み書きする』ことの禁止」というものがある
しかし、参照は本体を読み書きするためのものなので、当然本体より長生きすることがあれば「もう本体がなくなった後の場所を読み書きする」ことになってしまう
なので、Rustには「ライフタイム」という概念があって、参照の寿命が本体のそれを超えていないか、確認する仕組みになっているんだね
だから、ある関数に参照を渡して、その関数がまた参照を返すといったような動きをした場合、この返された参照のライフタイムが問題になる
当然、この返された参照は、この関数の中の変数は指していない
なぜなら、この関数が終わった時点でこの関数の中の変数は解放されてしまうから、それが返せてしまうと「もう本体がなくなった後の場所を読み書きする」ことになるからなんだ
じゃあ、ある関数が返す参照は、受け取った参照であるということになる
その時、たとえば関数が複数の参照を受け取っていたとして、Rustのコンパイラは関数の境界で追跡を止めるようになっているから、呼び出している側からは渡したどの参照が返ってきているのかわからない
109デフォルトの名無しさん
2026/07/16(木) 23:25:54.67ID:tqJQMSog しかし、複数の本体のライフタイムは必ずしも一致しているとは限らない(他の関数から借りている参照かもしれないし、一部の変数だけ drop() されてしまうかもしれない)ので、どの参照が返ってきているのかわからないということは、そのまま返ってきた参照のライフタイムがわからないことを意味してしまう
これがわからないままでは、「『もう本体がなくなった後の場所を読み書きする』こと」が防げなくなってしまうので、メモリ安全ではなくなってしまうんだ
だから、これはライフタイム注釈をつけてあげないと返せないことになっているし、そのライフタイムを超えて生き残る可能性がある関数には、渡すことができないことも決まっているんだ
つまり、Rustの参照は全て、ライフタイムの制約を受けているんだね
C / C++ などにはこの「ライフタイム」というシステムがないので、参照(Cであればポインタが指すアドレス)がいつまで生きているか、検証のしようがないんだ
これが「ダングリングポインタ」と呼ばれるもので、プログラムをクラッシュさせたり、データを破壊したり、場合によっては脆弱性の原因にもなってしまうんだね
だから、C / C++ から Rust に移行しよう、という話になっているんだよ
どうだったかな
Rustの参照は安全のためにライフタイムの制約を受けること、これがない C / C++ ではダングリングポインタの危険性があること
たぶん、プログラミングの経験がある程度あれば、Rust / C++ / C を書いたことがなくても、わかったんじゃないかな
……なので、
> Rustは関数が引数で受け取った参照を常に関数の返り値として返すことができる
> ライフタイムによる制約はない
> Rustはあらゆる寿命の参照について
> 引数として受け取った関数はそれを常に安全に返すことができる
というのは大間違いなんだね!
これがわからないままでは、「『もう本体がなくなった後の場所を読み書きする』こと」が防げなくなってしまうので、メモリ安全ではなくなってしまうんだ
だから、これはライフタイム注釈をつけてあげないと返せないことになっているし、そのライフタイムを超えて生き残る可能性がある関数には、渡すことができないことも決まっているんだ
つまり、Rustの参照は全て、ライフタイムの制約を受けているんだね
C / C++ などにはこの「ライフタイム」というシステムがないので、参照(Cであればポインタが指すアドレス)がいつまで生きているか、検証のしようがないんだ
これが「ダングリングポインタ」と呼ばれるもので、プログラムをクラッシュさせたり、データを破壊したり、場合によっては脆弱性の原因にもなってしまうんだね
だから、C / C++ から Rust に移行しよう、という話になっているんだよ
どうだったかな
Rustの参照は安全のためにライフタイムの制約を受けること、これがない C / C++ ではダングリングポインタの危険性があること
たぶん、プログラミングの経験がある程度あれば、Rust / C++ / C を書いたことがなくても、わかったんじゃないかな
……なので、
> Rustは関数が引数で受け取った参照を常に関数の返り値として返すことができる
> ライフタイムによる制約はない
> Rustはあらゆる寿命の参照について
> 引数として受け取った関数はそれを常に安全に返すことができる
というのは大間違いなんだね!
110デフォルトの名無しさん
2026/07/16(木) 23:26:21.86ID:tqJQMSog 途中でぶった切った上にまともに読めないアホのために再掲
111デフォルトの名無しさん
2026/07/16(木) 23:27:24.06ID:tqJQMSog112デフォルトの名無しさん
2026/07/16(木) 23:28:31.42ID:tqJQMSog113デフォルトの名無しさん
2026/07/16(木) 23:29:29.45ID:tqJQMSog 具体的な書き方やルールを知りたい場合は
ライフタイムで参照を検証する - The Rust Programming Language 日本語版
https://doc.rust-jp.rs/book-ja/ch10-03-lifetime-syntax.html
を読むといいよ
なお、ここにも普通に
> ライフタイム省略
> 全参照にはライフタイムがあり、参照を使用する関数や構造体にはライフタイム引数を指定する必要があることを学びました。
って書いてるね
ライフタイムで参照を検証する - The Rust Programming Language 日本語版
https://doc.rust-jp.rs/book-ja/ch10-03-lifetime-syntax.html
を読むといいよ
なお、ここにも普通に
> ライフタイム省略
> 全参照にはライフタイムがあり、参照を使用する関数や構造体にはライフタイム引数を指定する必要があることを学びました。
って書いてるね
114デフォルトの名無しさん
2026/07/16(木) 23:30:33.52ID:+qjQFMRo いやいや、これはどんな場合でも成立するよ
>> 「Rustはあらゆる寿命の参照について
>> 引数として受け取った関数はそれを常に安全に返すことができる」
>> 「Rustはあらゆる寿命の参照について
>> 引数として受け取った関数はそれを常に安全に返すことができる」
115デフォルトの名無しさん
2026/07/16(木) 23:32:13.26ID:tqJQMSog >>114
じゃあ「パッと思いついただけでも複数の参照を受け取る関数や、コールバック関数などは参照をそのまま返すことはできないし、他のスレッドに行く場合も当然無理」を覆す新説を持ってきてくれw
この条件で、実際にライフタイム注釈なしにコンパイルが通るコードを出してくれたら信じるよww
じゃあ「パッと思いついただけでも複数の参照を受け取る関数や、コールバック関数などは参照をそのまま返すことはできないし、他のスレッドに行く場合も当然無理」を覆す新説を持ってきてくれw
この条件で、実際にライフタイム注釈なしにコンパイルが通るコードを出してくれたら信じるよww
116デフォルトの名無しさん
2026/07/16(木) 23:33:47.45ID:tqJQMSog まあ、The Rust Programming Languageの著者
●Steve Klabnik:Mozilla勤務。Rustドキュメンテーションチームのリーダーであり、Rustの核となる開発者の一人。
●Carol Nichols:Rustコアチームのメンバー。Rust Belt Rust Conferenceを管理している。
が
> ライフタイム省略
> 全参照にはライフタイムがあり、参照を使用する関数や構造体にはライフタイム引数を指定する必要があることを学びました。
って書いてるから、参照にライフタイムがないと主張するなら、少なくともRustコアチームよりRustに詳しい自信があるということになってしまうけどねw
●Steve Klabnik:Mozilla勤務。Rustドキュメンテーションチームのリーダーであり、Rustの核となる開発者の一人。
●Carol Nichols:Rustコアチームのメンバー。Rust Belt Rust Conferenceを管理している。
が
> ライフタイム省略
> 全参照にはライフタイムがあり、参照を使用する関数や構造体にはライフタイム引数を指定する必要があることを学びました。
って書いてるから、参照にライフタイムがないと主張するなら、少なくともRustコアチームよりRustに詳しい自信があるということになってしまうけどねw
117デフォルトの名無しさん
2026/07/16(木) 23:34:31.33ID:tqJQMSog ライフタイムはあるけど参照に寿命はない、なんてバカげたことは言うなよw
118デフォルトの名無しさん
2026/07/16(木) 23:36:18.74ID:tqJQMSog119デフォルトの名無しさん
2026/07/16(木) 23:39:14.06ID:+qjQFMRo ライフタイム注釈は、より強い制約を与えることも可能な場合があるためにある
それゆえライフタイム注釈に関わらず、以下は常に成立する
>> 「Rustはあらゆる寿命の参照について
>> 引数として受け取った関数はそれを常に安全に返すことができる」
それゆえライフタイム注釈に関わらず、以下は常に成立する
>> 「Rustはあらゆる寿命の参照について
>> 引数として受け取った関数はそれを常に安全に返すことができる」
120デフォルトの名無しさん
2026/07/16(木) 23:41:10.61ID:tqJQMSog まあ、このスレってRustの専門スレじゃないから仕方ないっちゃないのかもしれないけど、ID:+qjQFMRo, ID:cwi1cuXm, ID:86x3Bz3M, ID:Ue5AUbKn, ID:iZ1BaTzv, ID:Mw+1/AR/, ID://w25X3S とRustを書いたことがあればしない間違いを全く同じようにしてる奴がこれだけいるというのは、知ったかぶりが過ぎるなあ
121デフォルトの名無しさん
2026/07/16(木) 23:44:40.56ID:+qjQFMRo ID:tqJQMSog氏は、参照を返せない具体的なコード例を示してごらん
そんなコードは作れなくて、以下は正しいとわかるから
>> 「Rustはあらゆる寿命の参照について
>> 引数として受け取った関数はそれを常に安全に返すことができる」
そんなコードは作れなくて、以下は正しいとわかるから
>> 「Rustはあらゆる寿命の参照について
>> 引数として受け取った関数はそれを常に安全に返すことができる」
122デフォルトの名無しさん
2026/07/16(木) 23:44:47.23ID:tqJQMSog123デフォルトの名無しさん
2026/07/16(木) 23:46:24.14ID:tqJQMSog >>121
こっちが書く前にまた間違いを増やしてるし
fn main() {
let string1 = String::from("abcd");
let string2 = "xyz";
let result = longest(string1.as_str(), string2);
// 最長の文字列は、{}です
println!("The longest string is {}", result);
}
fn longest(x: &str, y: &str) -> &str {
if x.len() > y.len() {
x
} else {
y
}
}
はい、そのままさっきのThe Bookのページのコードね
こっちが書く前にまた間違いを増やしてるし
fn main() {
let string1 = String::from("abcd");
let string2 = "xyz";
let result = longest(string1.as_str(), string2);
// 最長の文字列は、{}です
println!("The longest string is {}", result);
}
fn longest(x: &str, y: &str) -> &str {
if x.len() > y.len() {
x
} else {
y
}
}
はい、そのままさっきのThe Bookのページのコードね
124デフォルトの名無しさん
2026/07/16(木) 23:47:19.25ID:tqJQMSog このコードはコンパイルエラーになる
その理由は何度も言ったように >>108-109 に書いてあります
その理由は何度も言ったように >>108-109 に書いてあります
125デフォルトの名無しさん
2026/07/16(木) 23:49:50.86ID:j/d0+3d7126デフォルトの名無しさん
2026/07/16(木) 23:54:56.90ID:dDECB2A7127デフォルトの名無しさん
2026/07/16(木) 23:56:13.41ID:tqJQMSog >>125-126
私は「ライフタイムの制約を受ける」と言っているのであって、「無条件に返せる」なるバカ発言を否定してるだけだぞ
「無条件に返せない」なんていつ言ったのか、捏造はやめてもらいたい
あと、またIDをコロコロ変えてるなw
私は「ライフタイムの制約を受ける」と言っているのであって、「無条件に返せる」なるバカ発言を否定してるだけだぞ
「無条件に返せない」なんていつ言ったのか、捏造はやめてもらいたい
あと、またIDをコロコロ変えてるなw
128デフォルトの名無しさん
2026/07/16(木) 23:57:55.64ID:tqJQMSog ID:dDECB2A7, ID:j/d0+3d7, ID:+qjQFMRo, ID:cwi1cuXm, ID:86x3Bz3M, ID:Ue5AUbKn, ID:iZ1BaTzv, ID:Mw+1/AR/, ID://w25X3S と、必死こいて「ライフタイムの制約を受ける」を「無条件に返せない」に捏造して、「ライフタイム関係なく無条件に返せる」なるバカ発言をした自分が勝てると勘違いしてるみたいだなw
129デフォルトの名無しさん
2026/07/16(木) 23:58:48.81ID:tqJQMSog 全部文字記録として残ってるのに、どうしてその場の発言みたいに軽々捏造できると勘違いしたんだかww
130デフォルトの名無しさん
2026/07/17(金) 00:01:12.33ID:rgZeOBea >>123の例もライフタイムの制約を受けずに参照を返せる
引数xと引数yが異なるライフタイムであっても同じライフタイム注釈を与えてやればxとyどちらになろうと返り値として返せる
引数xと引数yが異なるライフタイムであっても同じライフタイム注釈を与えてやればxとyどちらになろうと返り値として返せる
131デフォルトの名無しさん
2026/07/17(金) 00:02:32.23ID:eJfcvx1B >>130
ライフタイム注釈をつけているのはなぜか考えない素晴らしい思考停止だなw
ライフタイム注釈はコンパイラに参照のライフタイムを教え、これで問題がないか検証させるための仕組みだぞ
つまり、ゴリッゴリにライフタイムの制約を受けている
ライフタイム注釈をつけているのはなぜか考えない素晴らしい思考停止だなw
ライフタイム注釈はコンパイラに参照のライフタイムを教え、これで問題がないか検証させるための仕組みだぞ
つまり、ゴリッゴリにライフタイムの制約を受けている
レスを投稿する
ニュース
- 【愛知・名古屋アジア大会】トラブル続発で…五輪やW杯の招致に影響必至「日本の信用低下に」「国際問題レベル」★2 [jinjin★]
- 「本業声優かと思ったら」文句なく上手くて”炎上しなかった”芸能人起用のアニメ映画 [muffin★]
- 【8割おじさん】新型コロナ猛威に「人との接触を8割減らす」と呼びかけたのは正しかったか…第一線で発信を担った専門家は反省を口に★2 [煮卵★]
- 豚が覆いかぶさった状態で発見 農場で倒れていた22歳男性が死亡・鹿児島 [えりにゃん★]
- 【概算要求】高市内閣「内閣広報予算」10倍の72億円要求 動画に壮大なBGM 総理希望で広報官起用 [ぐれ★]
- 【テレビ】平野レミ、生放送で突然告知→NHKアナ「公共放送ですよ」「本当にやめてください」 本気で怒る [冬月記者★]
- 【退任会見】 佐藤栄作総理 「僕は偏向的な新聞は大嫌いだ」→ 新聞記者全員退席 [419054184]
- 男子高校生だけど質問ある?
- 【ジャップ悲報】トー横キッズ、新宿駅で一般人を警棒で無差別にボコボコにして炎上 [939270813]
- 【高市悲報】アジア大会スタッフ、タイミーだった.. [469534301]
- 連休特別企画
- 【朗報】林芳正「(総裁選に)出る以上は勝つ。俺が高市を倒す。」 [996534393]