#matlab #octave
#matlab #octave
Вопрос:
В MATLAB мы можем удалить объект с помощью
o = obj();
delete o;
Можем ли мы явно удалить объект в массиве?
arr = {obj(), obj(), obj()};
delete arr{1}; % ???
Кроме того, освобождает ли MATLAB память, если мы вызываем delete явно?
Ответ №1:
Во-первых, эта строка
delete o;
делает не то, что вы думаете. В синтаксисе команды o интерпретируется как строка, и это приведет к удалению файла с именем «o» в вашем текущем рабочем каталоге.
Если вы хотите удалить объект o
, вам нужно использовать функциональный синтаксис, т.е.
delete(o); % where o is an object in the workspace.
Однако это тоже не делает того, что вы думаете!
«Удаление» уничтожает объект, на который ссылается дескриптор, т.Е. дескрипторы графических объектов (например, графики) или объекты matlab, наследуемые от суперкласса дескриптора. Обратите внимание, что сама переменная «handle» o
все еще находится в вашей рабочей области и указывает на удаленный объект!
Если у вас есть просто обычная переменная / объект, и вы просто хотите удалить его из рабочей области, вы просто clear
это сделаете.
Во-вторых, arr — это не «массив», это массив ячеек. Это немного педантичный момент, но важный, поскольку matlab допускает обычные массивы объектов.
В-третьих, да, чтобы ответить на ваш вопрос, есть способ явно удалить / удалить объект в массиве, так что массив снова соединяется вместе. Способ сделать это — назначить в качестве элемента этого массива пустой элемент, т.е.
arr = {obj(), obj(), obj()};
arr(1) = [];
сборщик мусора matlab заботится о вещах под капотом, вам не нужно явно обрабатывать память в этом смысле.
PS. Все вышесказанное также относится к octave.