Какая разница между новыми /delete и:: new/:: delete?

new delete

или

::new ::delete

Мне интересно использование этого ::, поскольку оно работает нормально, если я удалю их.

Это все коды, написанные в учебнике по автоматическому указателю.

#include <cstddef>  
size_t* alloc_counter(){
    return ::new size_t;  
}  
void dealloc_counter(size_t* ptr){
    ::delete ptr;  
}  

Ответ 1

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

class A {
    void* operator new(std::size_t sz) { 
        /* 1 */ }
};

void* operator new(std::size_t sz) { 
        /* 2 */ }

void f() {
    A* a1 = new A;   // calls A::new (1)
    A* a2 = ::new A; // calls implementation 2 or compiler new
}

Это описано в п. 5.3.4. Новое, раздел 9:

Если новое выражение начинается с унарного оператора ::, имя функции распределения просматривается в глобальной области. В противном случае, если выделенным типом является тип класса T или его массив, имя функции распределения отображается в области T. Если этот поиск не находит имя или если выделенный тип не является типом класса, имя функции распределения просматривается в глобальной области.

(начиная с проекта N3797)

То же самое относится к delete и ::delete

Ответ 2

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