【C++打怪之路Lv6】-- 内存管理

简介: 【C++打怪之路Lv6】-- 内存管理

前言


C 或 C++ 为什么要有内存管理

C和C++需要内存管理的原因是

为了有效地控制动态内存分配与回收,防止内存泄漏和野指针,确保程序运行效率和稳定性


C/C++ 内存分布


C/C++将这些代码和变量等存在哪?

代码段 存储可执行程序的代码和只读常量
数据段 存储已初始化的全局变量和静态变量
用于程序运行时动态内存分配,从低地址向高地址增长
又叫堆栈,存储非静态局部变量/函数参数和返回值等,从高地址向低地址增长

那看看以下staticVar、localVal、char2、pChar3、ptr等存放在哪?

int globalVar = 1;        
static int staticGlobalVar = 1; 
 
int main()
{
  static int staticVar = 1;   
  int localVar = 1;       
 
  int num1[10] = { 1, 2, 3, 4 };  
  char char2[] = "abcd";      
  const char* pChar3 = "abcd";  
  int* ptr1 = (int*)malloc(sizeof(int) * 4); 
  int* ptr2 = (int*)calloc(4, sizeof(int));
  int* ptr3 = (int*)realloc(ptr2, sizeof(int) * 4);
 
  free(ptr1);
  free(ptr3);
 
  return 0;
}


C语言中动态内存管理方式


具体使用看该篇文章,这里简述保姆级教学 - C语言 之 动态内存管理

malloc

分配内存,开空间

calloc

开空间并初始化

realloc

对开空间的大小进行灵活调整

free

释放动态内存开辟的空间


C++内存管理方式(与C语言对比)


前奏

在学习C语言,我们是怎么开辟新空间和释放掉的?

虽说C++兼容C语言,那来到C++了,还是得升级一下的

那C++是如何申请和释放空间的呢?

new/delete 操作内置类型

小结

malloc 开空间

new     开空间并初始化  

new/delete 操作自定义类型


new 和 delete 的实现原理


new的原理 (operator new)申请空间调用构造
delete的原理 调用析构(operator delete)释放空间
new T[N]的原理 (operator new[] ->(实际上是operator new))先申请空间,再调用N次构造
delete T[N]的原理 先调用N次析构,再(operator delete[] ->(实际上是operator delete))释放空间


定位new表达式


定位new表达式允许在已分配的内存上执行构造函数以初始化对象

通常,使用new操作符为对象动态分配内存。

为了优化性能,有时会采用内存池技术,通过malloc分配一大块内存。内存池减少了与堆的交次数,提高了内存分配效率

对于通过malloc分配的自定义类型内存,必须使用定位new来手动调用构造函数。

 

目录
相关文章
|
2月前
|
存储 缓存 编译器
【硬核】C++11并发:内存模型和原子类型
本文从C++11并发编程中的关键概念——内存模型与原子类型入手,结合详尽的代码示例,抽丝剥茧地介绍了如何实现无锁化并发的性能优化。
|
17天前
|
存储 程序员 编译器
什么是内存泄漏?C++中如何检测和解决?
大家好,我是V哥。内存泄露是编程中的常见问题,可能导致程序崩溃。特别是在金三银四跳槽季,面试官常问此问题。本文将探讨内存泄露的定义、危害、检测方法及解决策略,帮助你掌握这一关键知识点。通过学习如何正确管理内存、使用智能指针和RAII原则,避免内存泄露,提升代码健壮性。同时,了解常见的内存泄露场景,如忘记释放内存、异常处理不当等,确保在面试中不被秒杀。最后,预祝大家新的一年工作顺利,涨薪多多!关注威哥爱编程,一起成为更好的程序员。
|
3月前
|
存储 缓存 C语言
【c++】动态内存管理
本文介绍了C++中动态内存管理的新方式——`new`和`delete`操作符,详细探讨了它们的使用方法及与C语言中`malloc`/`free`的区别。文章首先回顾了C语言中的动态内存管理,接着通过代码实例展示了`new`和`delete`的基本用法,包括对内置类型和自定义类型的动态内存分配与释放。此外,文章还深入解析了`operator new`和`operator delete`的底层实现,以及定位new表达式的应用,最后总结了`malloc`/`free`与`new`/`delete`的主要差异。
72 3
|
3月前
|
存储 编译器 Linux
【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)
本文介绍了C++中的类和对象,包括类的概念、定义格式、访问限定符、类域、对象的创建及内存大小、以及this指针。通过示例代码详细解释了类的定义、成员函数和成员变量的作用,以及如何使用访问限定符控制成员的访问权限。此外,还讨论了对象的内存分配规则和this指针的使用场景,帮助读者深入理解面向对象编程的核心概念。
221 4
|
4月前
|
程序员 C++ 容器
在 C++中,realloc 函数返回 NULL 时,需要手动释放原来的内存吗?
在 C++ 中,当 realloc 函数返回 NULL 时,表示内存重新分配失败,但原内存块仍然有效,因此需要手动释放原来的内存,以避免内存泄漏。
|
4月前
|
存储 编译器 对象存储
【C++打怪之路Lv5】-- 类和对象(下)
【C++打怪之路Lv5】-- 类和对象(下)
41 4
|
4月前
|
编译器 C语言 C++
【C++打怪之路Lv4】-- 类和对象(中)
【C++打怪之路Lv4】-- 类和对象(中)
42 4
|
4月前
|
存储 算法 调度
【C++打怪之路Lv11】-- stack、queue和优先级队列
【C++打怪之路Lv11】-- stack、queue和优先级队列
58 1
|
4月前
|
存储 算法 C++
【C++打怪之路Lv10】-- list
【C++打怪之路Lv10】-- list
29 1
|
4月前
|
存储 C++ 索引
【C++打怪之路Lv9】-- vector
【C++打怪之路Lv9】-- vector
35 1