内存管理 operator new
| 分配 | 释放 | 类型 | 可否重载 |
| malloc() | free() | C 函数 | 不 |
| new | delete | C++ expressions | 不 |
| ::operator new() | ::operator delete() | C++ 函数 | 可 |
| allocator<T>::allocate() | allocator<T>::deallocate() | C++标准库 | 自由设计 |
平时重载的是 operator new() 和 operator delete() 那个C++函数
因为 new 和 delete 编译器转换后就是使用 operator new() 和 operator delete(), 所以一般不去重载::operator new() 和 ::operator delete() 这两个全局的函数,而是重载对应 object 的 operator new() 和 operator delete(),在 new 和 delete 的时候对 object 做自己的操作。
所有 new 和 delete 最终都会解析为 malloc() 和 free()。
Replacement new
object对象无法直接调用构造函数,但是可以调用析构函数。
replacement new 允许我们将 object 建构于已分配的内存中,而且不会再次分配内存,相当于直接调用了构造函数。
代码第35行为对象指针直接调用构造函数,无法通过编译。
代码第36行使用 replacement new 可以再当前已分配内存中构造函数,不会在分配内存。第25行是 replacement new 的重载函数,可以看出,并不会再次分配内存。
1 #include "stdafx.h" 2 #include <iostream> 3 4 using namespace std; 5 6 class A 7 { 8 private: 9 int i; 10 public: 11 A(){i = 0; cout << "A() i = " << i << endl;}; 12 ~A(){i = 0;cout << "~A() i = " << i << endl;}; 13 A(int n){i=n; cout << "A(int n) i = " << i << endl;}; 14 15 void printA() 16 { 17 cout << "i = " << i << endl; 18 } 19 20 static void* operator new(size_t size){cout << "operator new" << endl; return (A*)malloc(size);}; 21 static void operator delete(void* ptr){cout << "operator delete" << endl; return free(ptr);}; 22 static void* operator new[](size_t size){cout << "operator new[]" << endl; return (A*)malloc(size);}; 23 static void operator delete[](void* ptr, size_t size){cout << "operator delete[]" << endl; return free(ptr);}; 24 25 static void* operator new(size_t size, void* buf){cout << "operator new buf" << endl; return buf;}; 26 static void operator delete(void* ptr, void* buf){cout << "operator delete buf" << endl;}; 27 }; 28 29 int _tmain(int argc, _TCHAR* argv[]) 30 { 31 A(); 32 cout << "===========" << endl; 33 34 A* b = new A(10); 35 //b->A(99); 36 new(b)A(99); 37 b->printA(); 38 b->~A(); 39 delete b; 40 41 A* c = new A[3]; 42 delete[] c; 43 44 system("pause"); 45 return 0; 46 }
A() i = 0
~A() i = 0
===========
operator new
A(int n) i = 10
operator new buf
A(int n) i = 99
i = 99
~A() i = 0
~A() i = 0
operator delete
operator new[]
A() i = 0
A() i = 0
A() i = 0
~A() i = 0
~A() i = 0
~A() i = 0
operator delete[]
请按任意键继续. . .

浙公网安备 33010602011771号