В настоящее время я смотрю на код C ++, который использует ::delete для удаления указателя.

Бессмысленный пример этого:

void DoWork(ExampleClass* ptr)
{
    ::delete ptr;
}

Какова цель использования ключевого слова delete таким образом?

8
Bryan Muscedere 20 Авг 2018 в 18:17

7 ответов

Лучший ответ

В некоторых случаях operator delete может быть переопределен - фактически перегружен - (например, ваш Class может определить его, а также определить operator new). Кодируя ::delete, вы говорите, что используете стандартное, «предопределенное», удаление. оператор.

Типичный вариант использования для переопределения обоих operator new и operator delete в некоторых Class: вы хотите сохранить скрытый глобальный набор всех указателей, созданных вашим {{X3 }} и удалено вашим Class::operator delete. Но реализация вашего delete удалит этот указатель из глобального набора перед вызовом глобального ::delete

11
Basile Starynkevitch 20 Авг 2018 в 15:31

Для этого используется выражение delete, но с дополнительным {{ X1}} префикс.

< EM> Синтаксис

:: (необязательно) delete выражение (1)

...

Уничтожает объект (ы), ранее выделенный выражением new и освобождает полученную область памяти.

Использование префикса :: повлияет на поиск:

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

Если :: присутствует в выражении удаления, этот поиск проверяет только глобальное пространство имен.

9
dfri 20 Авг 2018 в 16:05

delete в C ++ является оператором так же, как =. Поэтому он может быть повторно реализован. И так же, как =, повторная реализация специфична для класса, на который она ссылается. Добавление :: гарантирует, что оператор delete, который мы вызываем, является глобальным, а не специфичным для данного класса.

Это может быть полезно, когда вы повторно реализуете delete для определенного класса, а затем хотите сослаться на real .

6
doron 20 Авг 2018 в 20:23

Использование ::delete имеет довольно много применений в крупномасштабной программе, в вашем примере это не имеет большого смысла, но использование его в более широком контексте действительно позволяет следующее:

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

Ссылка ниже имеет довольно хорошее объяснение и примеры для размышления.

Источник: https://www.geeksforgeeks.org/scope-resolution-operator -в- с /

2
Callat 20 Авг 2018 в 15:25

Возможно, ваш класс перегружен new и delete. Итак, ::delete указывает на то, что мы имеем в виду глобальную область видимости, а не те, которые были переопределены в текущем классе.

Полезная ссылка: Что такое ":: operator new" и ":: operator delete" ?

0
Shrikanth N 20 Авг 2018 в 16:33

::delete является синонимом delete :: для объема. Например, Classname:: означает что-либо в пределах этого класса. В этом случае :: означает все, что ограничено по умолчанию (например, все, для чего вам не нужно включать пространство имен)

Delete освобождает указатель из кучи. Невыполнение этого условия будет означать, что при выходе из программы этот кусок памяти по-прежнему считается используемой ОС (ОС обычно очищает это, но не освобождает указатели).

Так обычно

int* intpointer = new int(5); //do something with intpointer delete intpointer

2
Prodigle 20 Авг 2018 в 15:25

Специфичные для класса перегрузки
Функции освобождения (17-24) могут быть определены как статические функции-члены класса. Эти функции освобождения, если предусмотрены, являются вызывается выражениями delete при удалении объектов (17,19,21) и массивы (18,20,22) этого класса, если выражение удаления не использовало form :: delete, которая обходит поиск класса. Ключевое слово static необязательно для этих объявлений функций: используется ли ключевое слово или нет, функция освобождения всегда является статической функцией-членом.

Это означает, что ::delete не равен delete. Разница здесь в том, что delete может быть переопределено и зависит от вашего объекта / класса. ::delete является глобальным

Я знаю, что в некоторых случаях вы не должны использовать ":: delete", это не будет работать

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

Подробнее здесь. Для этого есть целый раздел.

1
MTLaurentys 20 Авг 2018 в 15:36
51933839