[TOC]
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;
else
throw 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 object
p1 = nullptr;
4.3 Double Delection
- 重复删除,误删除其他信息
void sloppy()
{
int* p = new int[100];
// use *p
deletep[] 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 *p
delete 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/