📅  最后修改于: 2023-12-03 15:36:00.872000             🧑  作者: Mango
在 C++ 中,new
运算符用于在堆上动态分配内存。当我们需要自定义一个类的内存管理时,可以通过覆盖类的 new
运算符来实现。那么,如果我们同时覆盖全局的 new
运算符,会不会引起歧义呢?
答案是否定的。因为全局的 new
运算符和类特定的 new
运算符是不同的东西。全局的 new
运算符用于分配任何类型的内存,而类特定的 new
运算符仅用于分配特定类的对象。
为了说明这一点,我们来看一个例子。假设我们有一个名为 MyClass
的类,它有一个自定义的 new
运算符:
class MyClass {
public:
void* operator new(size_t size) {
std::cout << "Custom new operator called" << std::endl;
void* ptr = std::malloc(size);
return ptr;
}
};
在这里,我们覆盖了 MyClass
的 new
运算符,使其输出一条信息并使用 std::malloc
函数来分配内存。
现在,假设我们在 main
函数中创建一个 MyClass
对象:
int main() {
MyClass* obj = new MyClass;
return 0;
}
由于我们已经覆盖了 MyClass
的 new
运算符,所以程序将输出:
Custom new operator called
现在,让我们来测试一下全局的 new
运算符是否会被调用。我们可以使用 ::new
运算符来分配内存,它使用的是全局的 new
运算符:
int main() {
MyClass* obj1 = new MyClass;
MyClass* obj2 = ::new MyClass;
return 0;
}
在这里,我们分别使用了类特定的 new
运算符和全局的 new
运算符。程序只会输出一次信息:
Custom new operator called
这是因为全局的 new
运算符和类特定的 new
运算符不会有任何冲突或重叠,它们各自负责不同的内存分配任务。
因此,覆盖全局的 new
运算符和类特定的 new
运算符不会有歧义。在 C++ 中,它们被视为不同的运算符,它们各自的作用范围也是不同的。