Почему не удаляет, устанавливает указатель в NULL?

Согласно спецификации языка шейдинга Metal ( https://developer.apple.com/metal/Metal-Shading-Language-Specification.pdf , комментарии в соответствии с таблицей 12)

[ 114] Для [[color(m)]] m используется для указания индекса цветового вложения при доступе (чтение или запись) нескольких цветовых вложения в функции фрагмента. Атрибут [[color(m)]] поддерживается только в iOS.

blockquote>

Это означает, что вы не можете выполнять повторное считывание пикселей (считывание уже отрисованных пикселей из прикрепленной текстуры за один проход визуализации).

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

122
задан Sam 16 August 2014 в 14:23
поделиться

10 ответов

Сам Stroustrup отвечает. Выборка:

C++ явно позволяет реализацию, удаляют для обнуления lvalue операнда, и я надеялся, что реализации сделают это, но та идея, кажется, не стала популярной у реализаторов.

Но основной вопрос, который он поднимает, - то, что аргументом delete не должен быть lvalue.

146
ответ дан 24 November 2019 в 01:21
поделиться

Указатель может быть сохранен больше чем в одной переменной, устанавливание в NULL одного из них все еще оставило бы недопустимые указатели в других переменных. Таким образом, Вы действительно не получаете много, Вы более вероятно создаете ложное чувство защищенности.

Кроме того, этого, можно создать собственную функцию, которая делает то, что Вы хотите:

template<typename T>
void deleten(T *&ptr) {
  delete ptr;
  ptr = NULL;
}
18
ответ дан 24 November 2019 в 01:21
поделиться

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

Затем прибывает производительность. Вы, возможно, написали код таким способом, которым указатель сразу выйдет из объема после того, как удалят, сделан. Заполнение его с пустым указателем является просто пустой тратой времени. И C++ является языком с, "не нуждаются в нем? затем Вы не должны оплачивать его" идеологию.

При необходимости в безопасности существует широкий спектр интеллектуальных указателей в Вас сервис, или можно записать собственное - лучше и более умный.

61
ответ дан 24 November 2019 в 01:21
поделиться

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

36
ответ дан 24 November 2019 в 01:21
поделиться

Если у Вас есть массив указателей, и Ваше второе действие должно удалить пустой массив, то нет никакого смысла устанавливающего каждое значение в NULL, когда память собирается, освобождены. Если Вы хотите, чтобы это было пустым.. запишите пустой указатель в него :)

5
ответ дан 24 November 2019 в 01:21
поделиться

Поскольку нет действительно никакой потребности к, и потому что она потребовала бы, удаляют от указателя к указателю взятия, а не просто указатель.

12
ответ дан 24 November 2019 в 01:21
поделиться

delete используется главным образом в деструкторах, в этом случае устанавливание в NULL участника бессмысленно. Несколько строк позже, при закрытии }, участник больше не существует. В операторах присваивания удаление обычно сопровождается присвоением так или иначе.

Кроме того, это представило бы следующий недопустимый код:

T* const foo = new T;
delete foo;
7
ответ дан 24 November 2019 в 01:21
поделиться

Установка в NULL указателя автоматически не решила бы большинство проблем с использованием неверного указателя. Единственный катастрофический отказ, которого это избежало бы, - то, при попытке удалить его дважды. Что, если Вы называете функцию членства на таком указателе? Это все еще отказало бы (предполагающий, что это получает доступ к членским переменным). C++ не ограничивает Вас в вызывании никакой функции на Нулевых указателях, и при этом это не должно делать этого с точки зрения производительности.

3
ответ дан 24 November 2019 в 01:21
поделиться

Философия C++ является "платой за него, только если Вы используете его". Я думаю, что это может ответить на Ваш вопрос.

Также иногда у Вас могла быть своя собственная "куча", которая восстановит удаленную память.. или иногда указатель, не принадлежавший любой переменной. Или указатель, сохраненный в немногих переменных - это возможный нуль только один из них.
Поскольку Вы видите, что он имеет много проблем и возможных проблем.

4
ответ дан 24 November 2019 в 01:21
поделиться

C++ позволяет Вам определять свой собственный новый оператор и удалять так, чтобы, например, они использовали бы Ваше собственное средство выделения пула. Если Вы делаете это затем, возможно использовать новый и удалить с вещами, которые не являются строго адресами, но говорят что индексы в Вашем массиве пула. В этом контексте значение ПУСТОГО УКАЗАТЕЛЯ (0) могло бы иметь легальное значение (относящийся к первому объекту в пуле).
Так наличие удаляет ПУСТОЙ УКАЗАТЕЛЬ набора автоматически к его аргументу, не всегда имеет значение - устанавливает значение к недопустимому значению. Недопустимое значение не может всегда быть НУЛЕВЫМ.

4
ответ дан 24 November 2019 в 01:21
поделиться
Другие вопросы по тегам:

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