我有一个简单的程序,我正在尝试为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进行一次调用。
这种流程背后的原因是什么?
答案 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派生的任何类分配内存,那么将调用您的新内容。