new 和 delete
标准库中定义的 new 表达式返回一个 void * 指针,指向创建的对象的地址,new 实际上做了三件事 :
1. 按照给定的大小分配内存
2. 调用相应的构造函数
3. 返回指针
标准库中的 delete 是 noexcept 的,它做了两件事
1. 调用析构函数(如果有的话)
2. 释放内存
定位new 表达式
使用 定位new 时,传入一个地址,它的调用形式如下
其中 place_address 必须时一个指针。定位new表达式会调用标准库中的 operator new(size_t, void ) 来分配它的内存。该调用*不分配任何内存,只是简单的返回指针实参,它只是负责在给定的地址初始化给定的类型对象。也就是说,定位new允许我们在一个特定的、预先分配的内存上构造对象
malloc / free 与 new / delete 区别
malloc 根据给定大小分配内存并返回指针,而不会在分配的内存上构造对象。
new 在 malloc 的基础上,在分配的内存上构造对象。
- free 根据给定的地址,释放对应的内存
- delete 会先析构对象,接着再释放内存
在大多数博客之中, 他们称 new 返回的内存将存储在自由存储区, malloc 返回的内存将存储在堆区, 但我参考了 C专家编程 与 现代操作系统 两书, 在有关程序内存模型的章节都没有找到关于所谓的 “自由存储区” 相关的描述, 当然, 一部分原因是C专家编程中描述的是C程序的内存模型, 而C++可能与C在内存中有所差异.
解决
我在一片博客中找到了更合理的描述 :
从技术上来说,堆(heap)是C语言和操作系统的术语。堆是操作系统所维护的一块特殊内存,它提供了动态分配的功能,当运行程序调用malloc()时就会从中分配,稍后调用free可把内存交还;而自由存储是C++中通过new和delete动态分配和释放对象的抽象概念,通过new来申请的内存区域可称为自由存储区
- 来自 https://blog.csdn.net/weixin_40721097/article/details/115461980
那么我认为, 自由存储区 不应与我们常说的程序内存分区一起讨论.
显示的虚构函数调用
类的虚构函数是可以显式调用的,虽然析构函数会销毁对象,但是不会释放对象所占内存(并非指对象数据成员所占内存),如果希望重新在此内存上构造对象,可以使用 定位new