Rust part26

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
垢版 |
2024/09/20(金) 22:18:38.38ID:c48cFuZJ
公式
https://www.rust-lang.org/
https://blog.rust-lang.org/
https://github.com/rust-lang/rust

公式ドキュメント
https://www.rust-lang.org/learn

Web上の実行環境
https://play.rust-lang.org

※Rustを学びたい人はまず最初に公式のThe Bookを読むこと
https://doc.rust-lang.org/book/

※Rustを学ぶ際に犯しがちな12の過ち
https://dystroy.org/blog/how-not-to-learn-rust

※Rustのasyncについて知りたければ「async-book」は必読
https://rust-lang.github.io/async-book/

※次スレは原則>>980が立てること

前スレ
Rust part25
https://mevius.5ch.net/test/read.cgi/tech/1722354386/

ワッチョイスレ
プログラミング言語 Rust 4【ワッチョイ】
https://mevius.5ch.net/test/read.cgi/tech/1514107621/
2024/11/04(月) 17:41:55.51ID:P+qabS46
>>639
いや完全に脳みそ複オジでしょ
2024/11/04(月) 18:04:13.97ID:mBJjb45a
>>566
亀レスだけどアドレスにリスナーをバインドすればnetstat -aの結果にLISTEN状態で出てくるぞ
2024/11/04(月) 18:21:55.56ID:613UlU6B
>>641
型システム入門って読んだことないん?
13章で確保した参照を絶対解放しない言語考えてその型安全性(つまりメモリ安全)証明しているけどこれ言っても理解できん?
2024/11/04(月) 18:36:09.56ID:+Zn5uplp
そんなイキれるほど頭のいいこと言ってないから
freeしなきゃ安全!
はずいわ
2024/11/04(月) 18:36:26.40ID:0co8NUe7
そりゃ安全ではあるけど別の大問題を生むし……
わざわざそれを言ってるのって「Cであえて解放しないようにするとC++/RustでRAIIに任せるのと比べて(誤差レベルで)早い」って意見に対してくだらない意地張ってるだけじゃないですか
2024/11/04(月) 18:45:22.71ID:UYP+oEN0
>>643
#include <stdio.h>

int main() {
int x;
printf("%d\n", x);
return 0;
}

↑freeしてないけどメモリ安全ではないよ
何が安全なのか知らんけど
2024/11/04(月) 19:51:08.05ID:3WEWZAvC
>>644
引用文献載せるだけの行為に過剰反応するとかコンプでもあるんかな?
帰納法とか理解できないからこの本読めなくて可哀想w
2024/11/04(月) 19:52:09.07ID:3WEWZAvC
>>645
俺は寿命が短時間なのか想定されるプログラムで敢えてfreeしないアプローチを取るのは賛成やが
2024/11/04(月) 19:52:59.06ID:3WEWZAvC
>>646
この本ではdangling pointerのエラーについては発生しないこどメモリ安全だと主張している
2024/11/04(月) 21:16:42.38ID:nRSMDwEy
RAIIより単純なアプローチがもしあればRAIIは非科学的だぞという
このオッカムの剃刀自体が、科学的な実験やデータを必要としない哲学の思想だ
2024/11/04(月) 21:43:03.80ID:C+a/rILf
>>636
Rustでももちろん意図的に解放しない有用な方法を公式にサポートしている
これはヒープ領域の一部を解放しないことにして例えばスタティック領域のようにみなすことができる
つまりライフタイムを'staticにできるため構造体メンバーに制約なく組み込めて関数からも自由に返せるようになる
この機能はsafeなRustの標準ライブラリとして提供されている
2024/11/04(月) 22:47:38.24ID:pw9M2oNL
>>649
そりゃ「確保した参照を絶対解放しない言語」ならdangling pointerは発生しないだろ
でもC言語はそうじゃないしはfreeしなくてもdangling pointerは発生するから全然安全じゃない

結局「freeしなければ絶対安全」の正体は
「freeしなければfree起因によるdangling pointerは発生しない」というだけ
当たり前すぎて泣けてくる
2024/11/04(月) 23:29:15.46ID:nRSMDwEy
政治起因による制約さえ無くなれば経済が偉大になるという謎理論があるからな
2024/11/05(火) 22:33:43.60ID:foggTYfW
>>652
Rustなら色々な安全性を全て保ったまま扱えるよ
所有者と所有権を消滅させることと引き換えに&'static mut Tを得ることも安全に行われている
2024/11/05(火) 23:42:46.08ID:fXJW6BJV
&'static mut Tに何か代入したらどうなるの
代入前の値にdropが定義されてたら呼び出される?
それは実質的にfreeしてるのと同じなのでは
2024/11/06(水) 00:29:29.78ID:40oev9+T
>>655
デストラクタはその型の値に対して行われるものであって
一般的にはヒープメモリとは関係がない
たまたまその型(の一部)がヒープメモリを所有すれば当然解放される

一方で&'static mut Tの元はBox<T>そして&'static mut [T]の元はVec<T>
つまり解放されないのはBoxやVecという入れ物でありTの話ではない
2024/11/06(水) 07:25:52.71ID:wYgAHnia
構造体メンバーに!Copyを入れれば制約が生じる
Box<T>が!Copyだとしても&'static TはCopyだから制約がなくなった
ように見えるが、ヒープとか解放とかいうクソどうでもいい条件が増えてるんだよな
2024/11/06(水) 08:04:15.27ID:40oev9+T
&Tにスタック領域かヒープ領域かスタティック領域かの区別はなく意識することさえ必要ない
唯一の制約はライフタイムであり
staticでない&'a Tは所有者である'a Tより延命できない制約がある
一方&'static Tはプログラム終了時まで永遠に生きるため制約がない
2024/11/06(水) 23:12:54.20ID:wYgAHnia
同時に意識しろとはいわないが
少しずつでも森羅万象を意識しないと客観的にならない
660デフォルトの名無しさん
垢版 |
2024/11/07(木) 22:29:40.21ID:/292LLXT
>森羅万象

いわばまさに、だーらば
2024/11/07(木) 22:47:47.58ID:SSxPh9YO
static変数へ入れてしまう場合もプログラムの最後までヒープ解放しないよね
例えば以下は正規表現わざわざ使うまでもない簡単な例だけど
ヒープ領域を確保して内部に持つRegexを何度も作り直すムダを避けるためにstaticに持つよくあるパターンとか
それを解放するきっかけは最後までやって来ないよね

fn yyyymmdd(s: &str) -> Option<(u32, u32, u32)> {
const YYYYMMDD: &str = r"(\d\d\d\d)/(\d\d)/(\d\d)";
static RE: LazyLock<Regex> = LazyLock::new(|| Regex::new(YYYYMMDD).unwrap());

if let Some((_, [year, month, day])) = RE.captures(s).map(|caps| caps.extract()) {
let year = year.parse().ok()?;
let month = month.parse().ok()?;
let day = day.parse().ok()?;
Some((year, month, day))
} else {
None
}
}
662デフォルトの名無しさん
垢版 |
2024/11/08(金) 07:27:08.10ID:6g9EuKad
RustにJAVA厨が流れ着いてるのか
2024/11/08(金) 08:29:50.38ID:b6NZ3Dbv
}
else {
2024/11/08(金) 10:14:50.92ID:3hecOEMV
汚ジコード乙
2024/11/08(金) 12:15:41.38ID:F9yTI1pl
毎回初期化を避けるためにstatic←JAVA脳
ローカル変数やauto変数にいちいちstatic描かなくても一回しか初期化されない←関数脳
2024/11/08(金) 12:28:38.12ID:spBkjUqU
>>665
JavaだけでなくCでもRustでもどの言語でも同じだろ
2024/11/08(金) 15:26:29.46ID:/u/AnA38
regex literalのある言語を知らないとか原始人かよw
2024/11/08(金) 17:32:32.77ID:3z6JS0FZ
>>667
regex literalのある言語でもパターンが変数により変わる場合は別途生成になる
その場合に正規表現からオートマトンへのコンパイル結果をキャッシュする責務はプログラマー
それを何らかのオブジェクトに入れて毎回持ち回るのか避けてstatic変数などに入れてしまうかの話ではないか
2024/11/08(金) 18:37:15.71ID:cYDKHcpz
>>668
マジでregex literal知らんのだな
raw string literalとは違うのだよ!
2024/11/08(金) 19:37:52.69ID:/iMoAsCH
今確信したけどここまでの流れを見て断言するけど
Rustが主流の言語になることはないわな
2024/11/08(金) 20:12:43.27ID:3z6JS0FZ
>>669
正規表現パターンに変数やその式を使ったことないのかい?
それら式を用いるとコンパイル結果を自分でキャッシュ管理しなければならなくなる

具体的にはregex literalの有無で
(1) 無い言語の例としてPythonは効率化のためにはre.compile(パターン, ...)結果のキャッシュが必要
(2) 有る言語の例としてRubyは式を含む場合のみ毎回評価し直すためキャッシュが必要
(3) 有るがパターンに式を書けない言語の例としてJavaScriptはnew RegExp(パターン, ...)結果のキャッシュが必要

いずれもregex literalの有無に関わらずコンパイル結果のキャッシュが必要となる
2024/11/08(金) 20:55:31.49ID:Me1tPYCI
ものによるが暗黙にキャッシュする (プログラマが保存しないでよい) 言語処理系は存在するよ。
2024/11/08(金) 21:02:51.24ID:yNVczeuC
むしろ、コンパイルしてないほう(Arc<String>)をキャッシュする
そのStringが生きている間だけコンパイル結果を生かしておく

キャッシュが必要ならArcが必要と判明したせいでGC界隈の常識が覆された
2024/11/08(金) 21:23:43.02ID:3z6JS0FZ
>>672
暗黙にキャッシュは固定文字列パターンの時だけではないか?
パターン内の式の値が毎回替わりうる可能性があるから
言語側としては>>671のように毎回評価し直す仕様や
regex literalを用いず明示的にコンパイルする関数を呼ぶ仕様になっている
2024/11/08(金) 21:40:49.75ID:Me1tPYCI
>>674
いや、キャッシュというかいわゆるメモ化かな。
入力される値は変わりうるが、同じ入力に対しては同じ結果であることは保証される (かつ現実的な用途では同じ値が入力される可能性が高い) ので値とセットで記憶しておく方法で十分に処理コストを減らせる。
2024/11/08(金) 21:58:06.73ID:HF5jYlyP
全く異なるユースケースを持ち出してまで
「どの言語も同じ」ということにしたいらしい
2024/11/08(金) 22:27:14.73ID:Jmd1EJmL
>>674
Pythonのreなら直近の512個まで自動的にキャッシュされてるよ
2024/11/08(金) 22:28:21.24ID:Me1tPYCI
ワンライナーみたいな使い方をする言語では (結果的に無駄になってでも) 暗黙に色々やっといてくれるほうが便利ってこともあるからどんな言語でも Rust と同じ方式のはずとは言えんわな。
2024/11/08(金) 23:01:18.69ID:spBkjUqU
>>673
Arcは要らない
何度も使う固定の正規表現ならその関数かモジュールのstatic変数で十分
変数部分を持つ正規表現それぞれを何度も使い回すならその呼び出したい元の構造体フィールドに入れておけば十分

>>675
そんな一般的なメモ化は論外
ハッシュマップ相当のコストがかかる上に再利用しないものや不要になったものを持ち続ける愚かさ
2024/11/08(金) 23:54:55.29ID:B3hB3UkR
>Arcは要らない
ふーん

https://docs.rs/regex/latest/src/regex/regex/string.rs.html#101-104
2024/11/09(土) 00:23:52.73ID:3a9p/42P
それはRegexの内部実装なので無関係だね
CloneできるようにArcを使ってるよくある手だよ
2024/11/09(土) 01:08:06.88ID:CKaEi0Af

内部実装の話をしてるんではないのか
2024/11/09(土) 01:20:28.66ID:3a9p/42P
再コンパイルを避けるためにstaticで持ったりオブジェクトメンバーで持ったりと利用プログラマー側の話でしょ
その時に必要ならCloneもできるということ
2024/11/09(土) 01:27:01.06ID:NTU1NPwJ
何の話をしてるのか、誰か一人でも分かってるんだろうか
2024/11/09(土) 04:13:52.23ID:MgyqC3I+
>>679
「言語はどれも正規表現のコンパイル結果を記憶する処理はプログラマの責任」に対しての「そうではない」という実例が挙げられたのであって、良し悪しを論じる文脈ではない。
なにが言いたいのだ?
2024/11/09(土) 05:26:31.68ID:tGFuX1+9
話の流れが良く分からないけど、つまり正規表現をconst文脈でコンパイルできないRustはクソってこと?
2024/11/09(土) 09:50:01.85ID:V8dNW5L0
単に複オジがクソだってこと
2024/11/09(土) 12:02:14.96ID:6/tB/poi
いわゆるlet over lambdaがなかった時代には
static over fn
だったという話
2024/11/09(土) 12:56:57.97ID:Z6VLqth0
コーディング時に確定できる静的な正規表現と
実行時にならないと確定できない動的な正規表現は
用途も違うしプログラム内での扱い方も全然違うよね

前者が他言語なら正規表現リテラルでRustならstaticを使う分野
後者は普通staticは使わない(immutableなのかmutableなのかでまた少し違う)

Javaでstaticというのは前者だろうな
後者でも使えなくはないけど純Java脳の人は違うやり方をするはず
2024/11/09(土) 13:21:26.67ID:F1r07c7a
いつになったら、Rustで正規表現をconst文脈でコンパイルできるようになるの?
原理的に見込みない話?
2024/11/09(土) 14:07:10.40ID:6/tB/poi
ヒープの話に戻るが、サイズが静的に確定すればヒープを一切使わない保証もできる
2024/11/09(土) 14:59:50.94ID:JFkCBQN+
>>690
マクロ使えばできるが大変なので誰も作らない
言語に組み込まれるのは良くて20年後やろな
2024/11/09(土) 15:06:22.46ID:CKaEi0Af
>>690
https://github.com/rust-lang/regex/issues/913
クソ面倒なうえに劇的な効果があるわけでもなさそうだからやらねーとのこと
2024/11/09(土) 15:09:47.03ID:F1r07c7a
>>693
失望した
別の正規表現クレートが誕生するのを待つしかないのか
2024/11/09(土) 17:12:28.10ID:bFGQ+yoR
>chronoのようなほとんどのプログラムで使われない機能を
こういうことを書くやつに限って>>661みたいなコードを書いちゃうんだよなぁ
そういう時代じゃねぇだろっつーの
2024/11/09(土) 17:13:55.79ID:6/tB/poi
願望は笑いものになるが失望はそうでもない
前者は単独犯で後者は不特定多数だからだ
2024/11/09(土) 17:22:40.75ID:IbVEcqQg
正規表現の単なる説明例じゃないのか
しかも正規表現自体も単なる例でstaticに突っ込む話の説明例だろ
そもそもの話はヒープをプログラムの最後まで解放しなくていい話でstaticはその一例として出てきただけだよな
一番どうでもいい末節の正規表現で騒いでいて違和感
2024/11/09(土) 17:29:31.37ID:8+qKiGsp
>>693
読んでみたが機能充実(制限)と実行速度とバイナリサイズのどれを優先するかもしくはどの二つまで両立させるかで
どのエンジンやどんな中間表現やどこまで機能制限を行なうかのバリエーションが多すぎるようだ
万人の矛盾した要求を全て満たす万能なものを実現するのは不可能だから別々に叶えるしかないな
2024/11/09(土) 18:03:48.00ID:LybhxYMR
>>690
RustのconstってC++のconstexprだよな
どうやってヒープ領域を返すんだ?
C++だとconstexprの計算中はnew/deleteでヒープを一時利用できるけど
deleteせずに返すのはできないよな
2024/11/09(土) 18:14:19.13ID:6/tB/poi
正規とか文脈自由とかいうのは仕様のバリエーション
実装のバリエーションなど知ったことではない
2024/11/09(土) 22:22:44.34ID:bFGQ+yoR
>>697
例として出したものが
正規表現リテラルの代替策な上に
内部実装の都合上ヒープを確保してるだけで
本来はヒープである必然性もない

機能不足の代替策として
プログラムの最後まで開放しないような
ヒープの使い方もあるだろうという話なのか?
2024/11/09(土) 23:06:21.72ID:6/tB/poi
ロックして解放してロック解除しなければいい
2024/11/09(土) 23:11:14.97ID:Dc7LpAyZ
>>701
基本的な知識を身に着けろよ
正規表現を内部コードにコンパイルして持つ役目がRegex構造体
可変長になるのでVecで持っていて当然ヒープは必須
2024/11/10(日) 00:07:10.13ID:QiolRTDD
>>703
それは現状の内部実装上の都合の話
本質的にヒープが必須という話ではない
文字列リテラルにヒープが必須でないのと同じとでも言えばわかるかな?
2024/11/10(日) 02:33:30.98ID:OGC8ujy2
は~~~~キレそう
2024/11/10(日) 02:34:34.55ID:OGC8ujy2
なんの意味があんねや、このスレ
2024/11/10(日) 02:36:54.54ID:OGC8ujy2
Rustプログラマにとって有益な情報はこれ以上出ないし、まともなRustプログラマは全員逃げたことが確定して久しいので
次スレあたりから「Rust vs 世界中の全言語 Part27」とか「複製おじさんと遊ぼう Part27」とかにしましょっか
他にもスレタイ案募集
2024/11/10(日) 06:48:35.70ID:xIqOi7JH
>>704
おまえバカだろ
正規表現パターンは実行時に確定してコンパイルサイズも実行時に確定し上限サイズはわからない
ヒープは必須だ
709デフォルトの名無しさん
垢版 |
2024/11/10(日) 11:17:24.55ID:dkv1a77w
入力がコンパイル時に確定してるならサイズも確定するでしょ
理屈としては以下のようなものは作れると思う

struct CompTimeRegex<const N: usize> {
 data: [u8; N]
}

// 正規表現オブジェクトをコンパイル時に計算
// サイズは入力に応じて変わる
// 入力はリテラルのみ
let r = make_regex!("+\\d");

面倒だし、それでパフォーマンスが劇的に良くなるわけでも無いだろうから必要性は微妙なところ
詳しくないけど、手続きマクロの中なら計算のためにヒープを使うこともできるよね?
2024/11/10(日) 11:58:38.78ID:WMkhj3nA
BurntSushiのベンチ結果見た?
2024/11/10(日) 12:03:57.56ID:xIqOi7JH
それは入力固定で出力の型も別仕様の別の話だな
regex::Regexは実行時に正規表現が作られてもよく
それをコンパイルするためヒープが
使われている
2024/11/10(日) 12:23:01.33ID:mfp7bShs
正規表現をコンパイルするのと比べてヌル代入を許容するのは極めて容易で
ヌルを代入すればヒープが解放される
2024/11/10(日) 12:27:06.24ID:z1ldQRPb
const文脈って、実際今なんか有効な活用されてるの?
2024/11/10(日) 12:30:28.79ID:z1ldQRPb
ちなみにzigの似た機能は有効活用されまくり
2024/11/10(日) 12:38:27.50ID:OGC8ujy2
ぐちゃぐちゃできるとかできない言ってるが自分で実装する気のある人間は一人もいねえんだろ???
だったら終わりだよ
2024/11/10(日) 13:02:04.64ID:OGC8ujy2
>>711
だから>>709はCompTimeRegexという従来のRegexではない型を作って話を展開してるわけ
ちゃんと読めてる?
2024/11/10(日) 13:06:11.38ID:OGC8ujy2
意図的な誤読、ストローマン論法、誰もがわかりきった説明を脈絡無く貼って議論を拡散させる
マジで不毛
2024/11/10(日) 13:11:04.55ID:OGC8ujy2
結局さ
ヒープは全部開放しなさい派閥は>>661のコードでRegex内部のArcが未解放のままプロセス終了するのは、ええんか??ええんか??どうなんだオラ??って話ってことでええんよな
2024/11/10(日) 13:16:48.60ID:xIqOi7JH
>>716
全く別の話であり、これまでのregex::Regexについての話への言及・反論にはなっていないことを自覚できているならそれでよろしい
2024/11/10(日) 13:18:41.74ID:nOHdM7oG
>>718
Rustの標準ライブラリstdは
プログラム終了時に自動的にメモリが解放されるようなまともなOS環境を対象にしていて区別しているので大丈夫
OS無しの組み込み環境では#![no_std]を宣言してcoreライブラリのみサポートされる中でのプログラミングを行なう
2024/11/10(日) 14:48:06.15ID:AfmJKCJ3
>>707
みんな何処に逃げた?
2024/11/10(日) 15:04:06.89ID:qC3Ky4ZL
>>661
スコープを外れた場合と同じようにモジュールがアンロードされる際にデストラクトされる
2024/11/10(日) 16:19:33.44ID:OGC8ujy2
>>720
OS側でプロセスを終了させる際にメモリマップを捨てる処理のことを「解放」って呼んでるから君と君以外で話がすれ違うんだと思うよ
2024/11/10(日) 16:24:01.76ID:OGC8ujy2
あと、ええんかオラ?ってのは俺の直接の質問ではない、それに答えられてもへえそうですか
元の議題は>>661、さらに遡れば>>593であって、議題内容はそれでよいか?という確認をしているだけだ
2024/11/10(日) 16:26:17.63ID:OGC8ujy2
>>721
非匿名でまともな交流ができるコミュニティかもね
rust-jpのzulipとか、あるいは英語を頑張って公式コミュニティとかに行ったか、発言しなくてもROM専してるかも
726デフォルトの名無しさん
垢版 |
2024/11/10(日) 16:30:14.58ID:dkv1a77w
5chで聞くよりもChatGPTの方が適切な回答をくれると思う
Rustに限らず他の言語でも
2024/11/10(日) 16:34:57.50ID:OGC8ujy2
ChatGPTもついでにCopilot Chatもゴミだよ
省略されたライフタイムの展開が自分でやったのが合ってるか自信がなくて、試しにやらせてみたらメチャクチャなことばっか言いやがった挙げ句、キレてthe Refrenceのelision rulesのところをペタペタ3回くらいコピペしたらすみません間違っていました、何度も申し訳ございません言いながらやっと正解を返してくれた
決定論的な問題を解かせるのにはまったく向いてない
2024/11/10(日) 16:36:43.08ID:z1ldQRPb
>>727
最初からキレて始めればいいのでは?
2024/11/10(日) 16:39:08.93ID:OGC8ujy2
英語が話せる人はこっちに移住しよう!!! できない人もDeepL片手にカモン!!!
https://www.rust-lang.org/community

日本語コミュはこちら!!!ってかいい加減放置されきった翻訳版の責任者のケツ叩きに行こうぜ!!!
https://rust-lang-jp.zulipchat.com/
2024/11/10(日) 16:41:30.83ID:tFJCBt9m
>>728
キレるはともかく最初からelision rules貼ればよかった説は確かにそう、残念ながら二回目の機会がないが次はそうしてみるぜ
でもよお……こんなのrust-analyzerが完璧なinlay hint実装してくれりゃやらなくて済む話でもあるんだぜ
2024/11/10(日) 16:42:25.60ID:OGC8ujy2
およ? ID変わった
ID:OGC8ujy2=ID:tFJCBt9mです
2024/11/10(日) 16:53:56.32ID:ES+o9VJl
>>722
staticはdrop呼ばれない
2024/11/10(日) 17:11:30.76ID:a6nPaG4v
C++ で static オブジェクトの初期化順 (解体順) は問題を起こしがちだし、いっそそのへんは取り扱わないというのも妥当な判断のひとつではあるわな。
2024/11/10(日) 17:43:15.44ID:mfp7bShs
自動化をあきらめることは賛成
だが手動で解放する技術を不要な技術と見なすことには反対する
735デフォルトの名無しさん
垢版 |
2024/11/10(日) 18:43:44.99ID:dkv1a77w
StringやVecみたいなヒープを使う型をstaticで管理させた場合って、valgrindみたいなメモリリーク検出ツールに引っかかったりする?
dropが呼ばれなくても終了時に一応はメモリ解放してるのか、それとも本当に何もしていないのか
2024/11/10(日) 19:15:15.74ID:xIqOi7JH
>>733
Rustならstatic変数初期化はOnceLockやLazyLockでマルチスレッド競合を含めて安全に初期化できる
static変数でdropはプログラムの終了時も起きないがメモリ解放問題は普通のOS環境では関係ないため問題ない
どうしてもdropしたいなら例えばOptionで包んでtake()で取り出すなどで手動drop()が可能

>>735
手動dropしないならばヒープ領域を持っていても解放されない
これはBox::leak()などで意図的にメモリを解放しないようにした場合でも同様
普通のOS環境ならこれでも問題は全く起きないが
組み込み環境などで確実にメモリ解放したいならば用意するメモリアロケータで対応する
つまりプログラム終了時にメモリアロケータを呼び出して管理している全メモリを解放させればよい
2024/11/10(日) 19:59:43.87ID:tFJCBt9m
質問の答えになってないし、組み込み環境で「プログラムが終了」したり、「管理している全メモリを解放」できるアロケータが必要などとまで言い出した

いやはや
2024/11/10(日) 20:16:38.46ID:tFJCBt9m
>>735
>>661に適当にこれだけのmain足してvalgrindかけてみた

fn main() {
let s = "2021/07/04";
let (year, month, day) = yyyymmdd(s).unwrap();
println!("{}-{}-{}", year, month, day);
}

https://pastebin.com/UN84vEFb

まあ、リーク扱いで出るよね
こういうのがあんまり多いとマジのリークと区別付きづらくて大変そうだけど、なんかアノテーションみたいなので対策できたりするのかな?
739デフォルトの名無しさん
垢版 |
2024/11/10(日) 20:28:05.31ID:dkv1a77w
>>738
サンクス
過去にC++で似たようなケースで顧客から「あなたの所のライブラリを使うとメモリリークが検出されるんだけど?」って指摘されたことがあって気になった
説明して伝わる相手なら良いけど、そういう面倒な人からのクレームを避けたい場合はstaticは避けたほうが良さそうだな
本質的には重要な問題でないと思うけども
2024/11/10(日) 20:28:35.21ID:xIqOi7JH
>>737
組み込み環境であろうとなかろうと各プログラムは終了する
さらにOS環境でOS内であっても各カーネルモジュールのプログラムはアンロードで終了する
一方でもし完全にモノリシックな一つのシステムなら終了後をそもそも考える必要がない

メモリアロケータについては自作したことあるなら管理してるメモリの全解放なんて楽勝だと理解できるだろ
割り当て用に確保しているバッファを返却するだけだ
2024/11/10(日) 20:52:25.18ID:Qvjt9L31
お前ら、Rustでプログラム書いた後にvalgrind ってるの?
もうそういうの終わりにしたいからRust使ってるんじゃないの?
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。