目录
三、operator new和operator delete函数的重载版本
一、new表达式工作步骤
使用new表达式时发生的三个步骤:
1. 调用名为operator new的标准库函数,分配足够大的原始的未初始化的内存,以保存指定类型的一个对象
2. 运行该类型的一个构造函数初始化对象
3. 返回指向新分配并构造的构造函数对象的指针
二、delete表达式工作步骤
使用delete表达式时发生的两个步骤:
1. 调用析构函数,回收对象中数据成员所申请的资源
2. 调用名为operator delete的标准库函数释放该对象所用的内存(即回收对象本身占用的资源)
三、operator new和operator delete函数的重载版本
//operator new库函数 void *operator new(size_t); void *operator new[](size_t); //operator delete库函数 void operator delete(void *); void operator delete[](void *);
下面通过例子来说明这两个函数的用法
class Student { public: Student(int id, const char *name) : _id(id) , _name(new char[strlen(name) + 1]()) { cout << "Student()" << endl; strcpy(_name, name); } ~Student() { cout << "~Student()" << endl; delete [] _name; } void *operator new(size_t sz) { void *ret = malloc(sz); return ret; } void operator delete(void *pointer) { free(pointer); } void print() const { cout << "id:" << _id << endl << "name:" << _name << endl; } private: int _id; char _name; }; int main(void) { Student *pstu = new Student(100, "Jackie"); pstu->print(); delete pstu;//思考一下:对象的销毁与执行析构函数是不是等价的? return 0; } //注意:1、可以试试成员函数operator new/delete里面包含this没有? //2、将operator new/delete函数放在类外且不加类名与作用域限定符,又会产生什么现象,该如 何解释?
operator new/delete里面是没有this指针的.
注意:需要先将_name里面的东西释放过后,才能释放pstu对象本身.如果顺序反过来的就会造成内存泄露.
四、要求一个类只能创建栈对象
如果要求一个类只能创建栈对象,其意思是在创建出栈对象的同时,不能创建堆对象。以Student类型而言,
void test0() { //思考:栈对象的创建需要哪些条件?是不是只要构造函数不为私有就ok? Student s1(101, "John");//ok Student *pstu = new Student(101, "Mark");//error }
要达到以上的效果,咱们只需要将operator new放入Student类的private区域
五、要求一个类只能创建堆对象
如果要求一个类只能创建堆对象,其意思是在创建出堆对象的同时,不能创建栈对象。以Student类型而言,
void test1() { Student s1(101, "John");//error Student *pstu = new Student(101, "Mark");//ok }
要达到以上的效果,咱们只需要将Student类的析构函数放入private区域。
注意:这里需要单独写一个destroy函数,通过调用这个函数来完成堆对象的资源销毁,并且要注意对象本身的资源也需要进行销毁,那么此时this指针就会起到很大的作用,直接delete this即可完成对对象本身的销毁,这一步操作不仅会调用析构函数,还会完成对指针对象的销毁.