关于C ++全局运算符new:为什么可以替换它

时间:2010-04-28 11:23:16

标签: c++

我在VS2005中编写了一个小程序来测试C ++全局运算符new是否可以重载。它可以。

#include "stdafx.h"
#include "iostream"
#include "iomanip"
#include "string"
#include "new"

using namespace std;

class C {
    public:
        C() { cout<<"CTOR"<<endl; }
};

void * operator new(size_t size) 
{
    cout<<"my overload of global plain old new"<<endl;
    // try to allocate size bytes
    void *p = malloc(size);
    return (p);
}

int main() {
    C* pc1 = new C;
    cin.get();
    return 0;
}

在上面,我调用了operator new的定义。如果我从代码中删除该函数,则会调用C:\ Program Files(x86)\ Microsoft Visual Studio 8 \ VC \ crt \ src \ new.cpp中的operator new。

一切都很好。但是,在我看来,我对operator new的实现不会使new.cpp中的new重载,它会与它发生冲突并违反单一定义规则。为什么编译器不抱怨呢?或者标准是否说,因为operator new非常特殊,单定义规则在这里不适用?

感谢。

1 个答案:

答案 0 :(得分:7)

是的,全球operator new的特殊之处在于,程序可能会为其提供替代实施。

可替换表单是operator newoperator delete以及“无投掷”变体的单个对象和数组形式。其他形式,例如新位置不可替换。