我正在阅读SGI标准模板库的源代码.我发现operator new函数前面总是有一个双冒号.像这样:
T* tmp = (T*)(::operator new((size_t)(size * sizeof(T))));
Run Code Online (Sandbox Code Playgroud)
operator new可以在不添加::字段的情况下直接调用,那么为什么stl编码器会以这种方式编写它?如果我们不在::他们面前使用,可能会遇到什么陷阱或情况.
您可以为类重载operator new,并在其前面添加"::"将调用全局"default"运算符new而不是可能的重载.例如:
#include <iostream>
class Foo
{
public:
Foo() { std::cout << "Foo::Foo()" << std::endl; }
void * operator new(size_t )
{
std::cout << "Foo::operator new()" << std::endl;
return static_cast<Foo *>(malloc(sizeof(Foo)));
}
};
int main()
{
Foo foo;
std::cout << "----------------------" << std::endl;
Foo * p = new Foo;
std::cout << "----------------------" << std::endl;
Foo * q = ::new Foo;
}
Run Code Online (Sandbox Code Playgroud)
将打印
Foo::Foo()
----------------------
Foo::operator new()
Foo::Foo()
----------------------
Foo::Foo()
Run Code Online (Sandbox Code Playgroud)
编辑:剪切的代码确实不是关于在类范围中定义的operator new.一个更好的例子是:
#include <iostream>
namespace quux {
void * operator new(size_t s)
{
std::cout << "quux::operator new" << std::endl;
return malloc(s);
}
void foo()
{
std::cout << "quux::foo()" << std::endl;
int * p = static_cast<int*>(operator new(sizeof(int)));
}
void bar()
{
std::cout << "quux::bar()" << std::endl;
int * p = static_cast<int*>(::operator new(sizeof(int)));
}
} // namespace quux
int main()
{
quux::foo();
quux::bar();
}
Run Code Online (Sandbox Code Playgroud)
打印
quux::foo()
quux::operator new
quux::bar()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
385 次 |
| 最近记录: |