Ошибка сегментации Matlab при переносе вектора

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

Итак, да...

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

Ответы

Ответ 1

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

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

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