From f053937c8f4583ed3a004bcea954bcdec1d5d1f1 Mon Sep 17 00:00:00 2001 From: Habu Date: Fri, 17 Jun 2022 18:10:23 +0900 Subject: [PATCH] =?utf8?q?[Fix]=20=E4=B8=80=E9=83=A8=E3=81=AE=E9=AD=94?= =?utf8?q?=E6=B3=95=E3=81=A7=20smart=5Flearn=20=E3=81=8C=E6=AD=A3=E5=B8=B8?= =?utf8?q?=E3=81=AB=E6=A9=9F=E8=83=BD=E3=81=97=E3=81=A6=E3=81=84=E3=81=AA?= =?utf8?q?=E3=81=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit 言語仕様により std::initializer_list はコピーした時にリストの値自体のコピーはしない いわゆるシャローコピーである事が規定されている。 そのため、MSpellDrsDataのコンストラクタが終了した時に引数drsに構築されたリストの値を 保持する領域は解放されており、コンストラクタで生成したラムダ式にコピーキャプチャした std::initializer_list が指しているリストの値の領域は不正な領域となる。 結果として update_smart_learn の引数が想定していないものとなり、 smart_learn が 正常に機能しない。 ラムダ式にキャプチャする時に std::vector オブジェクトに初期化キャプチャすることで この問題を回避するように修正する。 --- src/mspell/mspell-data.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mspell/mspell-data.cpp b/src/mspell/mspell-data.cpp index ba0a4ed6b..cd268af1e 100644 --- a/src/mspell/mspell-data.cpp +++ b/src/mspell/mspell-data.cpp @@ -61,7 +61,7 @@ MSpellDrsData::MSpellDrsData() } MSpellDrsData::MSpellDrsData(std::initializer_list drs) - : execute([drs](auto player_ptr, auto m_idx) { + : execute([drs = std::vector(drs)](auto player_ptr, auto m_idx) { for (auto &d : drs) { update_smart_learn(player_ptr, m_idx, d); } -- 2.11.0