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.栈区

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

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

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

目录
相关文章
|
15天前
|
C语言 C++
c与c++的内存管理
再比如还有这样的分组: 这种分组是最正确的给出内存四个分区名字:栈区、堆区、全局区(俗话也叫静态变量区)、代码区(也叫代码段)(代码段又分很多种,比如常量区)当然也会看到别的定义如:两者都正确,记那个都选,我选择的是第一个。再比如还有这样的分组: 这种分组是最正确的答案分别是 C C C A A A A A D A B。
|
4月前
|
存储 程序员 编译器
玩转C++内存管理:从新手到高手的必备指南
C++中的内存管理是编写高效、可靠程序的关键所在。C++不仅继承了C语言的内存管理方式,还增加了面向对象的内存分配机制,使得内存管理既有灵活性,也更加复杂。学习内存管理不仅有助于提升程序效率,还有助于理解计算机的工作原理和资源分配策略。
|
3月前
|
存储 Linux C语言
C++/C的内存管理
本文主要讲解C++/C中的程序区域划分与内存管理方式。首先介绍程序区域,包括栈(存储局部变量等,向下增长)、堆(动态内存分配,向上分配)、数据段(存储静态和全局变量)及代码段(存放可执行代码)。接着探讨C++内存管理,new/delete操作符相比C语言的malloc/free更强大,支持对象构造与析构。还深入解析了new/delete的实现原理、定位new表达式以及二者与malloc/free的区别。最后附上一句鸡汤激励大家行动缓解焦虑。
|
4月前
|
安全 C语言 C++
彻底摘明白 C++ 的动态内存分配原理
大家好,我是V哥。C++的动态内存分配允许程序在运行时请求和释放内存,主要通过`new`/`delete`(用于对象)及`malloc`/`calloc`/`realloc`/`free`(继承自C语言)实现。`new`分配并初始化对象内存,`delete`释放并调用析构函数;而`malloc`等函数仅处理裸内存,不涉及构造与析构。掌握这些可有效管理内存,避免泄漏和悬空指针问题。智能指针如`std::unique_ptr`和`std::shared_ptr`能自动管理内存,确保异常安全。关注威哥爱编程,了解更多全栈开发技巧。 先赞再看后评论,腰缠万贯财进门。
238 0
|
5月前
|
存储 程序员 编译器
什么是内存泄漏?C++中如何检测和解决?
大家好,我是V哥。内存泄露是编程中的常见问题,可能导致程序崩溃。特别是在金三银四跳槽季,面试官常问此问题。本文将探讨内存泄露的定义、危害、检测方法及解决策略,帮助你掌握这一关键知识点。通过学习如何正确管理内存、使用智能指针和RAII原则,避免内存泄露,提升代码健壮性。同时,了解常见的内存泄露场景,如忘记释放内存、异常处理不当等,确保在面试中不被秒杀。最后,预祝大家新的一年工作顺利,涨薪多多!关注威哥爱编程,一起成为更好的程序员。
154 0
|
4月前
|
编译器 C++ 开发者
【C++篇】深度解析类与对象(下)
在上一篇博客中,我们学习了C++的基础类与对象概念,包括类的定义、对象的使用和构造函数的作用。在这一篇,我们将深入探讨C++类的一些重要特性,如构造函数的高级用法、类型转换、static成员、友元、内部类、匿名对象,以及对象拷贝优化等。这些内容可以帮助你更好地理解和应用面向对象编程的核心理念,提升代码的健壮性、灵活性和可维护性。
|
15天前
|
人工智能 机器人 编译器
c++模板初阶----函数模板与类模板
class 类模板名private://类内成员声明class Apublic:A(T val):a(val){}private:T a;return 0;运行结果:注意:类模板中的成员函数若是放在类外定义时,需要加模板参数列表。return 0;
|
15天前
|
存储 编译器 程序员
c++的类(附含explicit关键字,友元,内部类)
本文介绍了C++中类的核心概念与用法,涵盖封装、继承、多态三大特性。重点讲解了类的定义(`class`与`struct`)、访问限定符(`private`、`public`、`protected`)、类的作用域及成员函数的声明与定义分离。同时深入探讨了类的大小计算、`this`指针、默认成员函数(构造函数、析构函数、拷贝构造、赋值重载)以及运算符重载等内容。 文章还详细分析了`explicit`关键字的作用、静态成员(变量与函数)、友元(友元函数与友元类)的概念及其使用场景,并简要介绍了内部类的特性。
|
2月前
|
编译器 C++ 容器
【c++11】c++11新特性(上)(列表初始化、右值引用和移动语义、类的新默认成员函数、lambda表达式)
C++11为C++带来了革命性变化,引入了列表初始化、右值引用、移动语义、类的新默认成员函数和lambda表达式等特性。列表初始化统一了对象初始化方式,initializer_list简化了容器多元素初始化;右值引用和移动语义优化了资源管理,减少拷贝开销;类新增移动构造和移动赋值函数提升性能;lambda表达式提供匿名函数对象,增强代码简洁性和灵活性。这些特性共同推动了现代C++编程的发展,提升了开发效率与程序性能。
90 12
|
3月前
|
设计模式 安全 C++
【C++进阶】特殊类设计 && 单例模式
通过对特殊类设计和单例模式的深入探讨,我们可以更好地设计和实现复杂的C++程序。特殊类设计提高了代码的安全性和可维护性,而单例模式则确保类的唯一实例性和全局访问性。理解并掌握这些高级设计技巧,对于提升C++编程水平至关重要。
76 16