#include<iostream> #include<string.h> typedef unsigned int size_t; using namespace std; class A { public: A(); static void* operator new(size_t size); //定义操作符new重载函数 }; A :: A() { } void* A :: operator new(size_t size) { A *temp = :: new A(); //调用new操作符开辟空间 if(temp!=NULL) { cout << "开辟空间成功!" << endl; } return temp; } main() { A *p = new A; return 0; }
如上代码,对new进行重载,但是看不懂 A *temp = :: new A(); 这一行代码,哪位能给仔细讲讲
另外A *p = new A;这一句调用的时候也不是很懂?
解决方案
2
这个重载是错误的,看不懂就不看吧
应该这样做
void* A :: operator new(size_t size)
{
void *temp = :: operator new(size); //调用全局 operator new函数 开辟空间
//一般自定义new 的目的,是用本人定义的内存管理函数,
// 替换系统内存管理函数,这里偷个懒,直接调用
// :: operator new.是没计划本人写, 内存管理函数,
if(temp!=NULL)
{
cout << “开辟空间成功!” << endl;
}
return temp;
}
应该这样做
void* A :: operator new(size_t size)
{
void *temp = :: operator new(size); //调用全局 operator new函数 开辟空间
//一般自定义new 的目的,是用本人定义的内存管理函数,
// 替换系统内存管理函数,这里偷个懒,直接调用
// :: operator new.是没计划本人写, 内存管理函数,
if(temp!=NULL)
{
cout << “开辟空间成功!” << endl;
}
return temp;
}
10
#include<iostream>
#include<string.h>
typedef unsigned int size_t;
using namespace std;
class A
{
public:
A();
static void* operator new(size_t size); //定义操作符new重载函数
};
A :: A()
{
}
void* A :: operator new(size_t size)
{
A *temp = :: new A(); //调用全局域中的new操作符开辟内存空间,此处并没有调用类A的构造函数,只是开辟了内存空间。
if(temp!=NULL)
{
cout << "开辟空间成功!" << endl;
}
return temp;
}
main()
{
A *p = new A; //调用类A中的重载的new操作符。(一般在new表达式中,编译器会首先查找申请的类A中能否重载了new操作符,若用户本人重载了new操作符,则调用类A中的;若没有重载,则调用全局域中的new操作符。)
return 0;
}
16
A *temp = :: new A(); //调用全局的new动态分配A对象,地址返回给temp
A *p = new A; //动态分配A对象,地址返回给p
A *p = new A; //动态分配A对象,地址返回给p