【C++】Geekband - 专题一:new和delete的整理
1. new和delete的基本概念
1.1 new所隐含的三步内容
1.2 分配空间的位置
1.3 delete所隐含的两步内容
2. 使用方法
2.1 分配单个空间
2.2 array和vector的使用
2.4 class with array的使用
2.3 在Class中构造和析构函数中的使用
3. operator new/new[]和operator delete/delete[]的讨论
3.1 基本书写要求
3.2 overloading的设计
3.3 调用系统默认new和delete
3.4 可以替换默认new和delete的时机
3.5 placement operator new
4. 常见错误
4.1 忘记使用delete
4.2 Preemature Delection
4.3 Double Delection
4.4 避免在local object中使用new
4.5 析构函数使用virtual
Reference
1.1 new所隐含的三步内容
1.2 分配空间的位置
1.3 delete所隐含的两步内容
2. 使用方法
2.1 分配单个空间
2.2 array和vector的使用
2.4 class with array的使用
2.3 在Class中构造和析构函数中的使用
3. operator new/new[]和operator delete/delete[]的讨论
3.1 基本书写要求
3.2 overloading的设计
3.3 调用系统默认new和delete
3.4 可以替换默认new和delete的时机
3.5 placement operator new
4. 常见错误
4.1 忘记使用delete
4.2 Preemature Delection
4.3 Double Delection
4.4 避免在local object中使用new
4.5 析构函数使用virtual
Reference
1. new和delete的基本概念
1.1 new所隐含的三步内容
1.2 分配空间的位置
- free store = on the heap = in dynamic memory
1.3 delete所隐含的两步内容
2. 使用方法
2.1 分配单个空间
//auto pi = new int; // built-in type 不完成初始化auto pi = new int{}; // 系统会初始化 = 0//auto = pc new complex<double>;auto = pc new complex<double> {}; // 系统会调用初始化函数
2.2 array和vector的使用
2.4 class with array的使用
Code: https://github.com/weiweikong/Program_Practice/tree/master/160331.Geekband_Homework5
构造指针,从上至下一次创建
- 析构指针,从下至上一次销毁
2.3 在Class中构造和析构函数中的使用
3. operator new/new[]和operator delete/delete[]的讨论
3.1 基本书写要求
- 书写
operator new/ operator new[]要求- 返回值必须是
*void - 第一个参数必须是
size_t
- 返回值必须是
- 书写
operator delete/ operator delete[] 要求- 返回值必须是
void - 第一个参数必须是
void*
- 返回值必须是
- 完整书写样式

3.2 overloading的设计
基本例子
malloc和free的使用要小心
void* operator new(size_t size) {if (void* mem = malloc(size) // 判断是否成功return mem;elsethrow bad_alloc();}void operator delete(void* mem) noexcept{if (mem)free(mem)}
3.3 调用系统默认new和delete
Foo* pf = ::new Foo;::delete pf;
3.4 可以替换默认new和delete的时机
- 一些情况下,自定义的
new和delete的效率会很高,对内存池的操作。 - 查看FIFO等内存调用顺序和资源管理。
3.5 placement operator new
- 见《Effective C++》 - Item 52
4. 常见错误
4.1 忘记使用delete
new的使用和delete要搭配
4.2 Preemature Delection
- 指针指向object, 但object其实已经不删除
int* p1 = new int{99}int* p2 = p2;delete p1; // p2 doesn't point to a valid objectp1 = nullptr;
4.3 Double Delection
- 重复删除,误删除其他信息
void sloppy(){int* p = new int[100];// use *pdeletep[] p;// other codes.delete[] p; // prone to wrong}
4.4 避免在local object中使用new
- local object中的return或exception throw可能会导致在执行
delete之前跳出,导致内存泄漏 - 不推荐
void f1() {X* p = new X;// ... use *p ...delete p;
- 推荐
void f2() {X x;// ... use x}
4.5 析构函数使用virtual
Base* p = new Child;// ... use *pdelete p;
- 此时
Base需要有virtual dtor,否则就会导致调用dtor错误
Reference
- Geekband
- 《C++ Primer 5th》 - Chp.19
- 《TCPL 4th》 - Chp.11.2
- 《Effective C++》 - Chp.8
- http://kelvinh.github.io/blog/2014/04/19/research-on-operator-new-and-delete/
e-mail: kongww.nudt [AT] gmail.com
WeChat/QQ: 40804097

浙公网安备 33010602011771号