C++中new运算符的运算符重载

lov*_*ing 0 c++ operator-overloading

在以下代码中:

#include<stdlib.h>
#include<iostream>

using namespace std;

class Test {
public:
    void* operator new(size_t size);
    void operator delete(void*);
    Test() { cout<<"\n Constructor called"; }
    ~Test() { cout<<"\n Destructor called"; }
};

void* Test::operator new(size_t size)
{
    cout<<"\n new called";
    void *storage = malloc(size);
    return storage;
}

void Test::operator delete(void *p )
{
    cout<<"\n delete called";
    free(p);
}

int main()
{
    Test *m = new Test();
    delete m;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出是:

new called
 Constructor called
 Destructor called
 delete called
Run Code Online (Sandbox Code Playgroud)

但是,当我调用 new 运算符时,我没有指定要分配给对象的大小,也没有使用任何默认值作为大小。有人可以解释为该对象分配多少内存以及为什么?

Yak*_*ont 6

operator new 传递 C++ 确定的分配所需的大小。

这不是您在调用时直接调用的内容new Test()- 相反,该语言将其(非常)粗略地转换为:

void* tmp = Test::operator new(sizeof(Test));
Test* result = ::new(tmp) Test();
Run Code Online (Sandbox Code Playgroud)

上面的第一行分配内存。第二个Test在那个内存中构造了一个;它被称为“放置新”。

构造和获取内存都被调用的事实new令人困惑,但确实如此。

(与编译器所做的真正等效的代码new Test()处理构造失败,遵循更复杂的查找规则等)。