栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++内存管理基础

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/990658.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号