为什么新调用3次而删除调用3次?

时间:2017-09-08 07:18:44

标签: c++

我有一个简单的程序,我正在尝试为new和delete执行运算符重载。

仅仅是为了尝试,除了类范围之外,我在全局范围内对new和delete进行了操作符重载。

#include<iostream>
#include<stdio.h>
 #include<stdlib.h>
using namespace std;

void * operator new(size_t size)
{
    cout<<"\n\nGlobal scope new:\n";
   void * ptr = malloc(size);
   return ptr;
}

void operator delete(void *ptr)
{
    cout<<"\n\nGlobal scope delete:\n";
    free(ptr);

}

  class test
  {

      public:
     int age;
     string name;

test(string str, int a)
{
    age = a;
    name = str;
}
 void display();   
 };

 void test::display()
 {
    cout<<"\n\nname is:-"<<name<<"  and age is :- "<<age<<endl;
 }


int main()
  {

  test *t = new test("sanjeev",29);
  if(t!=NULL)
  cout<<"\n\nMemory allocated:"<<endl;
  t->display();
   delete t;
 }

现在执行这个程序时,我看到new被调用了3次,delete被调用了3次。

如果我在类中声明new和delete运算符重载,则只会对new和delete进行一次调用。

这种流程背后的原因是什么?

2 个答案:

答案 0 :(得分:7)

std::string最终使用全局operator new。您正在创建两个std::string

答案 1 :(得分:1)

如果您不希望在这种情况下多次调用new,则应覆盖基类中的operator new:

class CBaseTest
{
public:
    void *operator new(const size_t allocation_size)
    {
        cout<<"\n\nMy new invoked:\n";
        return ::malloc(allocation_size);
    }

    void operator delete(void *block_of_memory)
    {
        cout<<"\n\nMy delete invoked:\n";
        ::free(block_of_memory);
    }
};

class test : public CBaseTest
{
public:
    int age;
    string name;

    test(string str, int a)
    {
        age = a;
        name = str;
    }
    void display();
};

void test::display()
{
    cout << "\n\nname is:-" << name << "  and age is :- " << age << endl;
}

下面

test *t = new test("sanjeev", 29);

将调用您的新方法。

类似地,

delete t;

将调用您的删除方法

现在,如果您尝试使用new为您的类测试或从CBaseTest派生的任何类分配内存,那么将调用您的新内容。