【C++】Geekband - 专题一:new和delete的整理
2016-04-03 18:36
459 查看
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.1
1.3
[/code]
2.2
2.4
Code: https://github.com/weiweikong/Program_Practice/tree/master/160331.Geekband_Homework5
构造指针,从上至下一次创建
析构指针,从下至上一次销毁
3.
返回值必须是
第一个参数必须是
书写
返回值必须是
第一个参数必须是
完整书写样式
[/code]
3.3 调用系统默认
[/code]
3.4 可以替换默认
一些情况下,自定义的
查看FIFO等内存调用顺序和资源管理。
3.5
见《Effective C++》 - Item 52
4.1 忘记使用
[/code]
[/code]
不推荐
[/code]
推荐
[/code]
4.5 析构函数使用
[/code]
此时
《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/
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 memory1.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> {}; // 系统会调用初始化函数
[/code]
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)
}
[/code]
3.3 调用系统默认new
和delete
Foo* pf = ::new Foo;
::delete pf;
[/code]
3.4 可以替换默认new
和delete
的时机
一些情况下,自定义的new和
delete的效率会很高,对内存池的操作。
查看FIFO等内存调用顺序和资源管理。
3.5 placement operator new
见《Effective C++》 - Item 524. 常见错误
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;
[/code]
4.3 Double Delection
重复删除,误删除其他信息void sloppy()
{
int* p = new int[100];
// use *p
deletep[] p;
// other codes.
delete[] p; // prone to wrong
}
[/code]
4.4 避免在local object中使用new
local object中的return或exception throw可能会导致在执行delete之前跳出,导致内存泄漏
不推荐
void f1() {
X* p = new X;
// ... use *p ...
delete p;
[/code]
推荐
void f2() {
X x;
// ... use x
}
[/code]
4.5 析构函数使用virtual
Base* p = new Child;
// ... use *p
delete p;
[/code]
此时
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/
相关文章推荐
- C语言学习笔记 -冒泡排序
- C++11的部分新特性解析
- C++11 lambda 表达式解析
- CHEMKIN 4.1 与 CHEMKIN-Pro 4.5 C++ Visual Studio 解决方案
- ACM常用的C++头文件!
- C++第2次实验作业
- NYOJ 16 矩形嵌套
- hao—C++和Java从编译到运行的过程区别
- 那些C++牛人的博客
- strcpy的使用以及注意事项
- C++矩阵运算库
- C语言格雷码相关
- C语言(三眼怪物)
- C++变量初始化顺序
- 20160403_C++初始化列表与赋值
- Visual C++笔记
- 大数乘法(C语言实现)
- c++之函数特性 重载 内联 函数默认值
- c++ 和 C#类型对照
- 29.C语言字符串和字符数组