operator new调用隐式创建对象:是否适用于类重载版本?
关于C++中operator new隐式创建对象规则的适用范围
这个规则同时适用于全局作用域的::operator new/::operator new[]和类重载的T::operator new/T::operator new[]。
根据C++标准相关条款的规定:
调用名为operator new或operator new[]的函数会隐式创建对象
这里的“名为operator new的函数”是泛指所有符合该名称的函数——无论是全局命名空间下的版本,还是作为类静态成员重载的版本。标准中并没有对这两类函数做区分,只要你调用的函数名称是operator new或operator new[],且返回的内存满足对应对象的大小与对齐要求,就会触发隐式对象创建的规则。
举个简单的代码示例:
class MyClass { public: static void* operator new(size_t size) { // 内部调用全局operator new分配内存 return ::operator new(size); } }; // 直接调用类重载的operator new MyClass* obj = static_cast<MyClass*>(MyClass::operator new(sizeof(MyClass)));
在这个例子中,调用MyClass::operator new分配内存后,标准会认定该内存区域已经隐式创建了一个MyClass类型的对象——即便我们没有显式调用构造函数,对象的“存在性”已经被标准认可。
需要额外注意的是,隐式创建对象的前提是分配的内存必须满足目标对象的大小与对齐要求,不管是全局版本还是类重载版本的operator new,只要不满足这个前提,隐式创建的规则就不会生效。
内容的提问来源于stack exchange,提问作者Oersted
相关产品推荐
相关产品推荐

