C++ 动态内存
new 和 delete
常规变量存储在被称为 栈 的内存区域中,而 new 从被称为 堆 或 自由存储区 的内存区域中分配内存
new 分配的内存使用 delete 释放,已经释放的内存不能再用 delete 释放,new 和 delete 成对出现,尽量放在一个函数中
new 分配的内存都是动态分配的,不是在编译时分配
运算符 new
和 new[]
分别调用如下函数:
1 | void * operator new (std::size_t); // used by new |
这些函数被称作分配函数,位于全局名称空间,同样也有
delete
和 delete[]
调用的释放函数
1 | int *p = new int[3]; |
new 负责在堆(heap)中找到一个足以能够满足要求的内存块。但是 new 运算符还有另一种变体,定位 new 运算符,它让您能够指定要使用的位置
1 |
|
但是不能用 delete 来释放 new 指定位置的内存,因为 buffer 指定的内存是静态内存
1 | char * buffer = new char[BUF]; |
allocator 类
new 将内存分配和对象构造组合在了一起,delete 将对象析构和内存释放组合在了一起。分配单个对象时,通常希望将内存分配和对象初始化组合在一起,但分配一大块内存时,通常计划在这块内存上按需构造对象,这时希望将内存分配和对象构造分离。
标准库 allocator 类定义在头文件 memory 中,它帮助我们将内存分配和对象构造分离,它分配的内存是原始的,未构造的。
1 |
|
标准库为 allocator 类定义了两个伴随算法用于拷贝和填充未初始化内存
1 |
|
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.