重载operator new(),为什么构造函数被调用两次?

时间:2017-07-07 03:19:17

标签: c++ class overloading

学习新/删除重载时,我无法理解一些问题。 问题:

  1. 为什么在构造函数之前调用new,在删除之前调用析构函数?
  2. 为什么在使用:: new?
  3. 时会调用构造函数两次

    我在这里添加了代码:

    #include<iostream>
    
    using namespace std;
    
    class MyClass
    {
    public:
        MyClass() { 
            cout << "My Class is Constructed !" << endl; 
    
        }
    
        ~MyClass() { cout << "My Class is Deleted ! " << endl; }
    
         static void *operator new(size_t Size)
        {
            cout << "new call" << endl;
            MyClass *p = ::new MyClass;
            return p;
         }
         static void operator delete(void *p)
         {
             cout << "delete call" << endl;
             ::delete p;
         }
    
    };
    int main()
    {
        MyClass  *p = new MyClass;
        delete p;
        cin.get();
        return 0;
    }
    
    output:
    new call
    My Class is Constructed !
    My Class is Constructed !
    My Class is Deleted !
    delete call
    

1 个答案:

答案 0 :(得分:4)

之所以发生这种情况,是因为当您使用new分配内容时,分配和构建分两个阶段进行。第一个是实际分配,第二个是通过新建的分配。

您提供的重载只是用于分配内存(因此是size_t参数),而是在类上调用new,它将从上面执行两个步骤。您应该只在该函数中分配内存。所以将你的功能改为

static void *operator new(size_t size)
{
   return ::operator new(size);
}

你会看到这个类只被构造一次。