您的位置:首页 > 编程语言 > C语言/C++

【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.
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> {}; // 系统会调用初始化函数

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

[/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/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: