C++相談室 part166 (635レス)
1-

リロード規制です。10分ほどで解除するので、他のブラウザへ避難してください。
1: sage (ワッチョイ 8732-NXaD) [] 2025/04/26(土) 10:34:58.41 ID:pbPDl6lv0(1/2) AAS
!extend:checked:vvvvv:1000:512
!extend:checked:vvvvv:1000:512
↑同じ内容を3行貼り付けること

次スレは>>980が立てること
無理なら細かく安価指定

※前スレ
C++相談室 part165
2chスレ:tech VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
611: デフォルトの名無しさん (ワッチョイ 7f5f-Z2G8) [] 2025/09/07(日) 13:56:14.79 ID:ZFShxqYO0(1) AAS
C/C++もポインタを代入するとそうなるよ
612: デフォルトの名無しさん (ワッチョイ a380-1jR+) [sage] 2025/09/07(日) 15:17:34.87 ID:DiKqvn8B0(1) AAS
この親父他の言語ほぼ使えんだろ
613
(2): デフォルトの名無しさん (アウアウウー Sa47-Y7lD) [] 2025/09/07(日) 15:34:33.99 ID:AK/wIzqla(1) AAS
普通 外部リンク:ideone.com
p=[3,1,2]
q=p
p[1]=0
print(q)
614
(1): デフォルトの名無しさん (ワントンキン MMe6-+IOe) [sage] 2025/09/07(日) 16:53:15.89 ID:2DaEs5aKM(1/2) AAS
>>610
610(2): デフォルトの名無しさん (ワッチョイ dbd6-ERpe) [sage] 2025/09/07(日) 07:39:38.11 ID:yhbLpr+z0(1/2) AAS
obj1=obj2;
の後obj2を変更すると、obj1が書き換わってまってびっくりして
その後、Javaが怖い親父です。
>>613
それはオブジェクトへの参照の競合が起きてる
それぞれで書き換え更新または読み取り中の書き換えをすることでスパゲッティなコードを招いてしまう
その競合をコンパイルエラーにして防いでくれるのはRustだけだと思う
615
(1): デフォルトの名無しさん (ワッチョイ dbd6-ERpe) [sage] 2025/09/07(日) 17:20:59.28 ID:yhbLpr+z0(2/2) AAS
>>614
c/c++なら、ポインタなのか参照なのか見ればわかるし、
まずコンパイラが型をチェックしますんで。はい
616: デフォルトの名無しさん (ワッチョイ 1ba6-aHNR) [sage] 2025/09/07(日) 17:34:06.57 ID:5bTmv8Qp0(1) AAS
参照メインの言語で書き換えを頻繁に行うとそりゃ事故るよ、注意力にも限界がある
値の書き換えをするならC++のように変数が直接値を持つ言語がいいし
参照をメインにするなら関数型言語のようにimmutableを基本にするべきだ
617: デフォルトの名無しさん (オッペケ Sr3b-wO3q) [sage] 2025/09/07(日) 18:17:46.03 ID:kASsF2K3r(1) AAS
ないしは、q=p; ってしたときに、pがダメになってくれるか
618
(2): デフォルトの名無しさん (ワントンキン MMe6-+IOe) [sage] 2025/09/07(日) 22:03:02.60 ID:2DaEs5aKM(2/2) AAS
>>615
C++では参照の競合があってもエラーとならず安全性は保証されないよ
例えば以下の挙動

std::vector<int> v{0, 1, 2, 3, 4, 5, 6, 7};
int& fifth = v[5];
v.push_back(100);
std::vector<int> w{8, 8, 8, 8, 8, 8, 8, 8};
fifth = 555;
std::cout << "v[5] = " << v[5] << std::endl;
std::cout << "w[5] = " << w[5] << std::endl;
619: デフォルトの名無しさん (ワッチョイ dbd6-ERpe) [sage] 2025/09/08(月) 07:59:15.17 ID:It1Ffdlu0(1/2) AAS
>>618
これわ別問題じゃないのですか。
にしても、おとろしい
push_backされた時点で再構築されて、新規作成のオブジェクトの要素を保持してしまったで合ってますか?
620
(2): はちみつ餃子◆8X2XSCHEME (ワッチョイ 1732-F+lb) [sage] 2025/09/08(月) 10:27:54.64 ID:bx3qX9/R0(1) AAS
状況を一から説明すると……
これは fifth が古い無効になった場所を参照する可能性があることが問題。

std::vector の各要素は連続した空間に配置されることが保証されている。
要素の増減でその場所の都合が悪くなれば再配置される可能性があり、
再配置が起こったときは要素を指していたイテレータや参照は無効になるというルール。
無効なイテレータや参照を通じてアクセスしたら何が起こるかわからない。

再配置が起こる可能性がある操作については個々に仕様に書かれているけれど、
キャパシティを変更する (可能性がある) ような操作はどれも再配置が起こりえると覚えておけばいい。

そんでもってこれのややこしいところは「可能性がある」ってところで、
キャパシティをどれくらい拡大するか実装によって差があるし、
状況によっては場所を移動せずに大きさを伸ばせるかもしれない。
つまり問題が顕在化しないかもしれない。

一般論として倍々に延ばす実装がよく知られているからこの例では最初に要素を 8 個にして
顕在化しやすいようにしたんだろう。
621: デフォルトの名無しさん (ワッチョイ dbd6-ERpe) [sage] 2025/09/08(月) 10:47:28.92 ID:It1Ffdlu0(2/2) AAS
>>620
どもです。要素数8ってのもさすがって感じでした。
622: デフォルトの名無しさん (ワンミングク MM8a-+IOe) [sage] 2025/09/08(月) 22:24:25.56 ID:EA0JjXQaM(1) AAS
>>620
今回の問題に限ればその通り
ただし問題の本質は二つの参照(変数fifthとpush_back呼び出し時の参照)を使ったこと
今回はダングリング参照で問題を分かりやすく示したがメモリ問題もvectorも本質ではなく任意のデータに対する参照で問題が起きる

既に参照fifthを持つ状況で同じデータを指す別の参照を関数push_backに渡してデータが書き換えられた
参照fifthが指す値は当初から値が変更されてしまったりダングリングで無効な値になる可能性がある
これが二つの参照の競合による問題で値がいつの間にか書き換わってしまっていることでバグも誘発する
両方の参照が書き換えを伴わないreadonlyの時のみ安全になる
片方もしくは両方の参照が書き換えを伴うと安全でなくなる
623
(1): デフォルトの名無しさん (ワッチョイ e3ad-ckwE) [sage] 2025/09/08(月) 23:06:53.70 ID:HoahUzIM0(1) AAS
再配置が行われるものに参照使って、その生存期間を超えてアクセスするのは未定義動作になるわな。C++に慣れてればそんなコードは書かないが、初級者向けではない。readonly より、lifetime の問題でしょう
624
(1): デフォルトの名無しさん (ワッチョイ 177c-h0AF) [sage] 2025/09/09(火) 00:29:11.16 ID:TMUamLpP0(1) AAS
参照が無効になる条件は規定されてるし、先にcapacity設定するとか避ける方法も用意されてる
「問題の本質」とやらはただのライブラリ仕様の無理解だろ
分かりにくいとか間違えやすいとかの批判なら分かるけど
625: デフォルトの名無しさん (ワントンキン MM8a-+IOe) [sage] 2025/09/09(火) 07:24:41.95 ID:DVL1/TmTM(1/2) AAS
>>623 >>624
申し訳ないがcapacityや再配置の話はしていない
lifetimeや参照が無効になる話もしていない
まずそれらを頭の中から消し去って考えよう
元々の話である同一データに対して参照が二つ持った時の話のみをしている
もちろんvectorは登場してもしなくてもいい
626: デフォルトの名無しさん (ワントンキン MM8a-+IOe) [sage] 2025/09/09(火) 07:29:27.85 ID:DVL1/TmTM(2/2) AAS
元々の話とは>>610>>613でこれらが参照の競合の最も単純な例
様々な言語で発生してもちろんC++でも生じる
同一データに対して複数の参照を持つと他の参照によっていつの間にか指していたデータの値が書き換わってしまう
これがバグやコードのスパゲッティ化を引き起こす最も大きな原因の一つ
そのためreadonlyでない限り複数の参照を避けるのが好ましい
そのため競合する参照を禁止している言語もある
627: デフォルトの名無しさん (スフッ Sdba-bj1o) [] 2025/09/09(火) 10:47:02.21 ID:g327vfuJd(1) AAS
readonlyでない競合する参照を禁止している言語もある
628: デフォルトの名無しさん (ワッチョイ 97e4-1jR+) [sage] 2025/09/09(火) 12:16:08.28 ID:iPWQv8Oa0(1) AAS
はいはい線型論理言いたいだけ
629: デフォルトの名無しさん (アウアウウー Sa47-Rd44) [sage] 2025/09/10(水) 00:51:51.50 ID:BnR46AnOa(1) AAS
>>618
これはvにpush_backしたところでキャパ超えて別の場所にリアロックされ、ともない元のvの領域が空になって、即座にwがスポンとそのvが元あった場所に配置されたってことなのですか?
630
(1): デフォルトの名無しさん (スッププ Sdba-j4tR) [sage] 2025/09/10(水) 02:12:52.51 ID:IF/zSGeMd(1) AAS
そうだよ。
規格上は何の保証もないから、処理系とかによっては全然違う結果になるかもしれないけど。
631: 629 (アウアウウー Sa47-Rd44) [sage] 2025/09/10(水) 10:07:49.21 ID:3vsmg39oa(1) AAS
>>630
どうもありがとう
632: デフォルトの名無しさん (ワッチョイ 4e1f-bj1o) [] 2025/09/10(水) 10:13:08.62 ID:zTYInGVv0(1) AAS
>再構築されて新規の要素を保持してしまったで合ってますか
こう聴かれると「違う」と返事したくなる
633: デフォルトの名無しさん (ワッチョイ 177c-h0AF) [sage] 2025/09/10(水) 18:40:20.64 ID:Vv9EwJFH0(1) AAS
未定義動作だからな
たまたま鼻から悪魔が出る代わりにそうなっただけだ
634: デフォルトの名無しさん (ワッチョイ a75f-ckwE) [sage] 2025/09/10(水) 22:18:27.54 ID:RAO/BxQt0(1) AAS
参照の競合という用語に違和感。並行性に関わる競合状態 (race condition) の話をしようとしているのか?
635: デフォルトの名無しさん (ワッチョイ b68c-1jR+) [sage] 2025/09/10(水) 22:31:03.50 ID:BZTqerG60(1) AAS
してない
1-
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 0.034s