c++学习笔记08 内存分区、new和delete的用法

简介: C++内存管理的学习笔记08,介绍了内存分区的概念,包括代码区、全局区、堆区和栈区,以及如何在堆区使用`new`和`delete`进行内存分配和释放。

一、内存分区

程序在编译后运行前,存在存在分区的情况,分别是代码区全局区

1. 代码区

用于存放编写的代码所转的二进制文件
特点:
共享:对于频繁被执行的程序,内存中只有一份代码
只读:防止程序以外修改了指令

2. 全局区:

用于存储全局量静态量(static)字符串常量

①全局量

全局变量:写在函数外的变量
全局常量:写在函数外的变量,经const修饰后成为全局常量,被常(const)的内容是不可修改的

②静态量

静态变量static用于修饰变量,使之以静态存储空间(不会变动地址)来保存内容,生命周期与程序相同,作用域为单个源文件内,与之区别的是extern,作用域为整个程序
“static”是用于控制变量的生命周期和连接方式(可见性)的保留字

静态变量的命名方法:

static int a=10;

③字符串常量

字符串常量:“hello world”为字符串常量

需要注意的是:

局部变量与局部常量存储不存储在全局区中
局部变量:函数里的变量
局部常量:在函数里的变量,经过const修饰后
特点:数据在程序结束后由系统释放
const修饰的 局部变量(函数中的未作特殊修饰的变量)是不在全局区存储的,而和其他局部变量保存在一起

######## 2022.5.3
3.堆区

由程序员分配和释放
在堆区中分配变量的内存空间:
利用new来开辟堆区的新的内存空间

int* func() //
{
   
    int* p = new int(10);// 利用new来开辟堆区的新的内存空间
    return p;
}

存放在堆区(程序员自己的空间区)的内存空间没有被销毁
这个指针保存的地址指向的内存是存在的,没有在函数执行完后被释放

int* p = func();
    cout << *p << endl;//多次输出依然如常
    cout << *p << endl;
    cout << *p << endl;

在堆区中释放变量的内存空间:

delete p;

new和delete在数组中的用法:

    int* array = new int[10];
    for (int i = 0; i < 10; i++)
    {
   
        array[i] = 100 + i;
    }
    for (int i = 0; i < 10; i++)
    {
   
        cout << array[i] << endl;

    }
delete[] array;

分区的好处:不同的生命周期,更灵活

4.栈区

是编译器自动管理的,用于存放局部变量和函数的参数值等
特点:

重点:
函数不要返回局部变量的地址

栈区的变量在一轮函数执行完后将释放,此时地址已然失效

目录
相关文章
|
8月前
|
安全 C语言 C++
比较C++的内存分配与管理方式new/delete与C语言中的malloc/realloc/calloc/free。
在实用性方面,C++的内存管理方式提供了面向对象的特性,它是处理构造和析构、需要类型安全和异常处理的首选方案。而C语言的内存管理函数适用于简单的内存分配,例如分配原始内存块或复杂性较低的数据结构,没有构造和析构的要求。当从C迁移到C++,或在C++中使用C代码时,了解两种内存管理方式的差异非常重要。
290 26
|
存储 安全 编译器
第二问:C++中const用法详解
`const` 是 C++ 中用于定义常量的关键字,主要作用是防止值被修改。它可以修饰变量、指针、函数参数、返回值、类成员等,确保数据的不可变性。`const` 的常见用法包括:
|
编译器 C++ 开发者
【C++】深入解析C/C++内存管理:new与delete的使用及原理(三)
【C++】深入解析C/C++内存管理:new与delete的使用及原理
314 3
|
存储 C++ 容器
【C++】map、set基本用法
本文介绍了C++ STL中的`map`和`set`两种关联容器。`map`用于存储键值对,每个键唯一;而`set`存储唯一元素,不包含值。两者均基于红黑树实现,支持高效的查找、插入和删除操作。文中详细列举了它们的构造方法、迭代器、容量检查、元素修改等常用接口,并简要对比了`map`与`set`的主要差异。此外,还介绍了允许重复元素的`multiset`和`multimap`。
413 3
【C++】map、set基本用法
第十三问:C++中静态变量的用法有哪些?
本文介绍了 C++ 中静态变量和函数的用法及原理。静态变量包括函数内的静态局部变量和类中的静态成员变量,前者在函数调用间保持值,后者属于类而非对象。静态函数不能访问非静态成员,但可以通过类名直接调用。静态链接使变量或函数仅在定义文件内可见,避免命名冲突。
|
程序员 C语言 C++
C++入门5——C/C++动态内存管理(new与delete)
C++入门5——C/C++动态内存管理(new与delete)
313 2
|
8月前
|
存储
阿里云轻量应用服务器收费标准价格表:200Mbps带宽、CPU内存及存储配置详解
阿里云香港轻量应用服务器,200Mbps带宽,免备案,支持多IP及国际线路,月租25元起,年付享8.5折优惠,适用于网站、应用等多种场景。
2802 0
|
8月前
|
存储 缓存 NoSQL
内存管理基础:数据结构的存储方式
数据结构在内存中的存储方式主要包括连续存储、链式存储、索引存储和散列存储。连续存储如数组,数据元素按顺序连续存放,访问速度快但扩展性差;链式存储如链表,通过指针连接分散的节点,便于插入删除但访问效率低;索引存储通过索引表提高查找效率,常用于数据库系统;散列存储如哈希表,通过哈希函数实现快速存取,但需处理冲突。不同场景下应根据访问模式、数据规模和操作频率选择合适的存储结构,甚至结合多种方式以达到最优性能。掌握这些存储机制是构建高效程序和理解高级数据结构的基础。
909 0
|
8月前
|
存储 弹性计算 固态存储
阿里云服务器配置费用整理,支持一万人CPU内存、公网带宽和存储IO性能全解析
要支撑1万人在线流量,需选择阿里云企业级ECS服务器,如通用型g系列、高主频型hf系列或通用算力型u1实例,配置如16核64G及以上,搭配高带宽与SSD/ESSD云盘,费用约数千元每月。
1085 0