2

我可以在 MyClass 的头文件中声明如下:

void* operator new(size_t size) throw(bad_alloc);

并在 MyClass 源文件中定义:

void* MyClass::operator new(size_t size) throw(bad_alloc)
{
    cout << "overloading new" << endl;
    return (::operator new(size));
}

并使用它:

MyClass *m = new MyClass();

所以我的问题是 - 在上面的代码行中我们使用重载的 new 运算符 - 我看不到我们将 size_t 类型的 size 参数传递给重载的 new 运算符?然而在重载 new 运算符的定义中它需要它吗?

4

1 回答 1

4

简短回答 根据使用 new 运算符创建的对象的大小,从编译器推断出大小。

例子

struct Example {
    int X;
    int Y;
}

Example *A = new Example();

将调用参数大小等于 8(x64 系统上为 16)的新运算符/函数,它也可以或多或少取决于对齐方式。

新调用将从编译器转换如下(如果构造函数中没有使用异常并且编译器决定优化不需要的 catch 块的捕获):

Example *A = (Example*)Example::new(sizeof(Example));
A->A(); // call constructor
于 2013-04-07T01:13:10.310 回答