C++内存管理基础

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值