2

我正在查看一些重载 new/delete 的示例代码

我有以下内容

// manage memory for instances
void * roun_class:: operator new(std::size_t s)
{
    void * result(::operator new(s));
    return result;    
}

这是第一次,我在看::operator。而且我在 Google/SO 中找不到任何关于它的信息。那么,有人可以解释一下为什么我们有 :: 并且前面没有类。这个::operator有什么特别之处?,

仅供参考,我已经看过以下 内容 ::operator() 做什么? 虽然并没有真正回答我的问题

4

4 回答 4

5

前导::通常表示全局命名空间(即没有命名空间),所以我猜::operator new有必要表明我们正在谈论内置的 new,而不是递归调用类的new.

于 2013-11-08T19:37:55.047 回答
5

::operator new(std::size_t)new(std::size_t)全局命名空间中的运算符(即:默认内存分配函数之一)。

之所以在这里调用::operator new它,是因为如果不是,这operator new将只是再次调用自身,这将导致堆栈溢出。

于 2013-11-08T19:38:07.640 回答
3

::称为范围解析运算符。
希望这个例子有帮助:

int count = 0;

int main(void) {
  int count = 0;
  ::count = 1;  // set global count to 1
  count = 2;    // set local count to 2
  return 0;
}

请参阅 C++ 参考: http: //publib.boulder.ibm.com/infocenter/macxhelp/v6v81/index.jsp ?topic=%2Fcom.ibm.vacpp6m.doc%2Flanguage%2Fref%2Fclrc05cplr175.htm

就新的超载而言。这是我给你的。

void* operator new ( std::size_t count ); //(1)   
void* operator new[]( std::size_t count ); //(2)    
void* operator new ( std::size_t count, const std::nothrow_t& ); //(3)    
void* operator new[]( std::size_t count, const std::nothrow_t& ); //(4)    
void* operator new ( std::size_t, void* ptr ); //(5)  
void* operator new[]( std::size_t, void* ptr ); //(6)

分配函数可以通过两种方式替换/重载:
在全局范围内:

为了调用它,重载分配函数的签名必须在分配位置可见,隐式声明的默认分配函数除外。此分配函数将用于当前程序中具有相应参数的所有分配

在本地范围内:

重载的运算符 new 必须是类的静态公共成员函数。此分配函数将仅用于该特定类的分配。

来源: http ://en.cppreference.com/w/cpp/memory/new/operator_new

于 2013-11-08T19:41:37.553 回答
1

它在“全局”命名空间中调用 new 运算符。这是 C++ 编译器中内置的一个。

于 2013-11-08T19:39:14.550 回答