Используя удаляют на указателях, переданных как аргументы функции

Используя nargin для установки значений по умолчанию для дополнительных аргументов и использующий nargout для установки дополнительных выходных аргументов. Быстрый пример

function hLine=myplot(x,y,plotColor,markerType)
% set defaults for optional paramters
if nargin<4, markerType='none'; end
if nargin<3, plotColor='k'; end

hL = plot(x,y,'linetype','-', ...  
              'color',plotColor, ...
              'marker',markerType, ...
              'markerFaceColor',plotColor,'markerEdgeColor',plotColor);

% return handle of plot object if required
if nargout>0, hLine = hL; end
9
задан Sam 11 August 2014 в 15:19
поделиться

7 ответов

Он всегда будет компилироваться без ошибок.

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

Основная идея, которую необходимо учитывать, - это "владение" указанными данными. Когда вы передаете этот указатель, владеет ли вызывающая функция передаваемыми данными? т.е. это единственное место, откуда можно ссылаться на эти данные? Вы отказываетесь от владения указанными данными без шансов, что вызывающая функция когда-либо снова будет ссылаться на данные? Если да, то вы должны удалить его.

Если вызывающая функция может снова ссылаться на данные, вы не должны удалять ее.

Если есть другие ссылки на данные через различные структуры данных, то это ' Небезопасно удалять эти данные, если в вашем коде не соблюдена дисциплина, гарантирующая, что вы никогда больше не будете ссылаться на данные из этих мест. Это сложно сделать, и это является источником многих ошибок программирования.

С ++ tr1 shared_ptr <> - это умный указатель, который помогает в подобных ситуациях - он управляет этой концепцией владения, сохраняя счетчик ссылок, который отслеживает количество ссылки на данные. Если счетчик ссылок равен 1, то имеется 1 чистый владелец. Если количество ссылок больше 1, то право собственности разделяется. Если счетчик ссылок равен 0, то больше нет ссылок на данные, и shared_ptr <> удалит их при вызове деструктора shared_ptr <>.

- это умный указатель, который помогает в подобных ситуациях - он управляет этой концепцией владения, поддерживая счетчик ссылок, который отслеживает количество ссылок на данные. Если счетчик ссылок равен 1, то имеется 1 чистый владелец. Если количество ссылок больше 1, то право собственности разделяется. Если счетчик ссылок равен 0, то ссылок на данные больше нет, и shared_ptr <> удалит их при вызове деструктора shared_ptr <>.

- это умный указатель, который помогает в подобных ситуациях - он управляет этой концепцией владения, поддерживая счетчик ссылок, который отслеживает количество ссылок на данные. Если счетчик ссылок равен 1, то имеется 1 чистый владелец. Если количество ссылок больше 1, то право собственности разделяется. Если счетчик ссылок равен 0, то ссылок на данные больше нет, и shared_ptr <> удалит их при вызове деструктора shared_ptr <>.

13
ответ дан 4 December 2019 в 07:35
поделиться

Да, это разрешено в C ++, но обычно это не считается хорошей практикой. Всегда лучше для класса, выполнившего новый , на удалить то же самое.

6
ответ дан 4 December 2019 в 07:35
поделиться

Да, это верно

Обычно это делается на C (очевидно, с malloc и free вместо new и delete). В C ++ обычно предпочтительно использовать другие идиомы управления памятью, например RAII , если это возможно.

7
ответ дан 4 December 2019 в 07:35
поделиться

Да, это совершенно законно . Вы можете удалить указатель откуда угодно, если он указывает на некоторый объект, размещенный в куче (или равен 0 ).

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

2
ответ дан 4 December 2019 в 07:35
поделиться

Это полностью законно, хотя в таком случае, вероятно, лучше управлять владением памятью с помощью чего-то вроде boost :: shared_ptr .

1
ответ дан 4 December 2019 в 07:35
поделиться

Это допустимо и может быть очень полезно при написании метода очистки для объекта, хотя в 9/10 раз вы захотите поместить логику очистки в деструктор.

Одной из веских причин для написания отдельной очистки было бы то, что вы хотите, чтобы объект оставался «живым», но не использовался какое-то время, возможно, в массиве или пуле объектов, которые вы время от времени извлекаете, когда вам нужен новый без требуются накладные расходы на конструктор.

Если вы собираетесь передавать указатели, вы должны проверить, нет ли их '

0
ответ дан 4 December 2019 в 07:35
поделиться

Это совершенно законно. Вы должны убедиться, что указатель не используется в вызывающей программе после этого момента. В общем, имя функции, выполняющей удаление, должно указывать на то, что происходит (например, содержать удаление, выпуск, освобождение и т. Д.). Другая потенциальная проблема заключается в том, чтобы убедиться, что данные, на которые указывают, были размещены с новым, а не новым [].

0
ответ дан 4 December 2019 в 07:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: