Я вектурировал некоторый код matlab, который я ранее написал, и во время этого процесса matlab начал сбой из-за сбоев сегментации. Я сузил проблему до одного типа вычислений: присваивание нескольким свойствам структуры.
Например, даже само присваивание этой формы в конечном итоге вызывает ошибку seg при выполнении несколько тысяч раз:
[my_class_instance.my_struct_vector.my_property] = my_class_instance.my_struct_vector.my_property;
Первоначально предполагалось, что это должна быть утечка памяти, поэтому попробовал распечатать свободную память Java после каждой итерации, но это оставалось довольно постоянным.
Так что да, совершенно не понимаю, почему это ломается: -/
ОБНОВЛЕНИЕ: следующие изменения устраняют сбои seg:
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, а затем упомянул то же обходное решение, которое я обнаружил: используйте временную переменную.
Итак, да...
довольно уверен, что этот вопрос заканчивается этим билетом поддержки, но если любые смелые люди хотят сделать снимок относительно того, почему эта ошибка существует вообще, я определенно все равно буду интересоваться таким ответом. (обучение - это весело!)