内存管理 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[]
请按任意键继续. . .

posted @ 2019-10-09 16:01  暗月梦影  阅读(51)  评论(0)    收藏  举报