以前に作成したmatlabコードをベクトル化してきましたが、このプロセス中に、セグメンテーション違反が原因でmatlabがクラッシュし始めました。問題を単一のタイプの計算、つまり複数の構造体プロパティへの割り当てに絞り込みました。
たとえば、このフォームの自己割り当てでさえ、数千回実行されると、最終的にセグメンテーション違反が発生します。
[my_class_instance.my_struct_vector.my_property] = my_class_instance.my_struct_vector.my_property;
私は当初、これはある種のメモリリークであると考えていたので、反復ごとにJavaの空きメモリを出力してみましたが、これはかなり一定のままでした。
そうそう、なぜこれが壊れるのかについて今は完全に途方に暮れています:-/
更新:次の変更により、セグメントの障害が修正されます。
temp = [my_class_instance.my_struct_vector];
[temp.my_property] = temp.my_property;
[my_class_instance.my_struct_vector] = temp;
問題は、なぜこれで何かが修正されるのかということです。おそらく構造体リストではなく、ハンドルクラスに繰り返しアクセスすることについて何か?
更新2:プロットの厚さ
私はついに問題を再現し、ここに投稿するのに十分簡単なダミープログラムを使用して回避策を示しました。
単純なクラス:
classdef test_class
properties
test_prop
end
end
そして、クラスで一連のベクトル割り当てを行い、常にクラッシュするプログラム。
test_instance = test_class();
test_instance.test_prop = struct('test_field',{1 1});
for i=1:10000
[test_instance.test_prop.test_field] = test_instance.test_prop.test_field;
end
更新3:プロットの薄さ
バグを見つけました。Matlabのテクニカルサポートによると、クラスプロパティの繰り返しのベクトル割り当ては、R2011a(およびおそらく以前のバージョン)では機能しません。彼は、R2012aで正常に機能すると言った後、私が発見したのと同じ回避策、つまり一時変数を使用することについて言及しました。
そうそう...
この質問はそのサポートチケットで終わることは間違いありませんが、大胆な個人がこのバグが存在する理由についてショットを撮りたい場合は、私は間違いなくそのような答えに興味があります。(学習は楽しいです!)