0

我有一个小小的疑问。我不知道我的问题是否有效,但我把它放在 SO 中。第一个问题:当我们在全局或类级别重载 operator new 和 operator delete(不适用于数组)时,然后如果我们创建一个对象数组,如下所示:

A* obj = new A[10];
delete []obj;

那么在这种情况下为什么它调用运算符 new 和 delete 即使我没有为数组重载,即我没有像下面那样重载

void* operator new[](size_t size){}

第二个问题:但是如果我像上面那样为数组重载 new 和 delete 运算符,那么它将调用具有数组语法的那个。

最后但并非最不重要的一点是,如果我根本不重载 new 和 delete 运算符,那么当我创建对象数组时将调用哪个运算符。它是一种数组语法还是普通的一种。如果我的问题不清楚,请告诉我。

4

1 回答 1

3

调用new T[n]时,内存由operator new[]( size_t ). 如果你替换这个函数,那么你的替换将被调用。如果不替换此函数,将调用默认实现,即根据定义:

void*
operator new[]( size_t n )
{
    return operator new( n );
}

换句话说,它转发给非数组operator new 函数。因此,如果您已经更换operator new(),您的更换将被调用。

(但是你为什么要这样做new []?我从来没有发现它有用的案例。)

于 2013-11-08T15:17:14.370 回答