Что действительно “(освобождает) новый” средний в C++?

Попробуйте снять флажок «Заключить все обновления сайтов» перед установкой вашего выбора. Потому что p2 будет пытаться проверить зависимость от всех доступных сайтов обновлений (сначала загрузите репозиторий метаданных) при проверке этой опции.

alt text

10
задан Skilldrick 22 June 2009 в 22:36
поделиться

3 ответа

Приведение выражения к (void) в основном указывает компилятору игнорировать результат этого выражения (после его вычисления).

В вашем примере каждое из выражений (для каждого оператора / строки ) динамически выделяет память с помощью оператора new - и, поскольку new возвращает указатель (адрес) в память, обычно этот указатель сохраняется в переменной, которую можно использовать для окончательного удаления объекта и освобождения памяти. В вашем примере, поскольку указатель отбрасывается, явное приведение к (void) делает намерение программиста ясным: «Я точно знаю, что делаю - пожалуйста, отбросьте значение, возвращаемое new»

Если вам интересно в технических деталях (цитата из стандарта C ++, пункт 5):

Любое выражение может быть явно преобразовано в тип cv void. Значение выражения отбрасывается. [Примечание: однако, если значение находится во временной переменной (12.2), деструктор для этой переменной не выполняется до обычного времени, а значение переменной сохраняется для выполнения деструктора. —В конце примечания]
Стандартные преобразования lvalue-to-rvalue (4.1), массива в указатель (4.2) и функции в указатель (4.3) не применяются к выражению.

И если вам интересно, как эти объекты становятся удаляются (если они действительно удаляются), ответ заключается в том, что указатель this в конструкторе QShortcut должен иметь то же значение, что и возвращаемый функцией new, и его можно передать в ShortcutManager. Обратите внимание, что «this» в конструкторе отличается от указателя this, который передается конструктору QShortcut.

21
ответ дан 3 December 2019 в 15:36
поделиться

Некоторые компиляторы C ++ выдают предупреждение, если вы отбрасываете возвращаемое значение такой функции. В этом случае код выглядит как утечка памяти, поэтому вы получаете предупреждение. (void) указывает компилятору не выдавать предупреждение: «Относитесь к этой функции так, как если бы она вернула void ».

7
ответ дан 3 December 2019 в 15:36
поделиться

Я думаю, что ссылка, возвращенная оператором new , не назначена указателю. Я вижу, что этот передается, поэтому QT должен что-то сделать с этой ссылкой.

0
ответ дан 3 December 2019 в 15:36
поделиться
Другие вопросы по тегам:

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