Сегментации Матлаб при переборе вектора

Я векторизу некоторый код matlab, который я ранее написал, и во время этого процесса matlab начал сбой из-за ошибок сегментации. Я сузил проблему до одного типа вычислений: присвоение нескольким свойствам структуры.

например, даже самостоятельное присвоение этой формы в конечном итоге вызывает ошибку seg при выполнении несколько тысяч раз:

[my_class_instance.my_struct_vector.my_property] = my_class_instance.my_struct_vector.my_property;

Я изначально предполагал, что это должна быть утечка памяти, поэтому попытался распечатать свободную память java после каждой итерации, но это оставалось довольно постоянным.

Так что да, полностью в недоумении, почему это ломается: -/

UPDATE: следующие изменения исправляют ошибку seg:

temp = [my_class_instance.my_struct_vector];

[temp.my_property] = temp.my_property;

[my_class_instance.my_struct_vector] = temp;

теперь вопрос в том, почему это что-то исправит. Возможно, что-то о повторном доступе к классу дескрипторов, а не к списку структур?

ОБНОВЛЕНИЕ 2: СЮЖЕТ СГУЩАЕТСЯ

Я, наконец, воспроизвел проблему и работу с помощью фиктивной программы, достаточно простой, чтобы опубликовать здесь:

a простой класс:

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, а затем упомянул тот же обходной путь, который я обнаружил: используйте временный переменная.

да...

довольно уверен, что этот вопрос заканчивается этим билетом поддержки, но если какие-либо смелые люди хотят сделать снимок о том, почему эта ошибка существует вообще, я определенно буду заинтересован в таком ответе. (учиться-это весело!)

1 ответов


на сегодняшний день наиболее вероятной причиной является то, что операция внутренне использует самоизменяющийся код. Проблема в том, что современные процессоры имеют кэш процессора, поэтому, если вы измените код в памяти, но код уже был зафиксирован в кэше, он будет генерировать ошибку seg.

причина, по которой он является случайным, заключается в том, что он зависит от того, находится ли измененный код в кэше во время модификации и других факторов.

чтобы избежать этого программист должен быть убедитесь, что код очистит кэш перед выполнением самомодификации.