为何std::allocator<T>::allocate会调用::operator new?
std::allocator::allocate中
::operator new的疑问解答 注:数组的存储通过调用
::operator new获取([new.delete]),但该函数的调用时机与频次未指定。此函数启动数组对象的生命周期,但不启动任何数组元素的生命周期。
双冒号的核心区别
::operator new明确指定调用全局命名空间下的标准内存分配函数;而不带双冒号的operator new会遵循C++的名称查找规则,优先级如下:
- 优先查找当前作用域(比如
std::allocator的子类、调用allocate的代码所在命名空间)中的自定义重载版本 - 若当前作用域无匹配项,才回退到全局命名空间的
operator new
标准文档使用::operator new的原因
std::allocator作为标准库的通用内存分配器,必须保证行为的一致性和可预测性。明确使用全局命名空间限定符,是为了强制调用标准定义的全局operator new,避免意外触发用户在局部作用域或类中重载的operator new,从而破坏allocator的通用性和标准语义。
省略双冒号可能调用的版本
如果省略双冒号,编译器会根据上下文的名称查找结果选择:
- 若当前作用域存在用户自定义的
operator new重载(比如类专属的成员operator new、命名空间级别的重载),会优先调用该重载 - 只有当所有局部作用域都无匹配重载时,才会调用全局的
operator new
内容的提问来源于stack exchange,提问作者Daniel Langr
相关产品推荐
相关产品推荐

