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;
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/