【C++初阶学习】C/C++内存管理(1)

简介: 【C++初阶学习】C/C++内存管理(1)

零、前言


本章将学习掌握C++的内存管理,以及明白C和C++内存管理的相同与不同


一、C/C++内存分布


  • 示例:


int globalVar = 1;
static int staticGlobalVar = 1;
void Test()
{
  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);
}


  • 变量储存分布:


image.png


说明:

栈又叫堆栈,非静态局部变量/函数参数/返回值等等,栈是向下增长的


内存映射段是高效的I/O映射方式,用于装载一个共享的动态内存库,用户可使用系统接口创建共享共享内存,做进程间通信


堆用于程序运行时动态内存分配,堆是可以上增长的


数据段–存储全局数据和静态数据


代码段–可执行的代码/只读常量 (指令以及常量)


二、C语言动态内存管理


注:具体相关知识在–>C语言内存管理


  • malloc/calloc/realloc/和free:



示例:


void Test()
{
  int* p1 = (int*)malloc(sizeof(int));
  int* p2 = (int*)calloc(4, sizeof(int));
  int* p3 = (int*)realloc(p2, sizeof(int) * 10);
  // 1.malloc/calloc/realloc的区别是什么?
  //  malloc在堆上开辟对应字节的空间,不初始化
  //  calloc开辟对应字节的空间并初始化为0
  //  realloc调整应经动态开辟空间的大小,可以扩容也可以缩小
  free(p1);//申请动态开辟空间需要进行释放,否则可能造成内存泄漏
  //realloc扩容有两种情形,一是在原空间上进行扩(后面有足够大的空间)
  //二是另找一足够大的空间进行开辟,并将原空间内容拷贝(原空间后没有足够大的空间),且自动释放原空间
  //所以此处只需要释放p3就行了
  free(p3);
}


三、C++动态内存管理


  • 概念:


C语言内存管理方式在C++中可以继续使用,但有些地方就无能为力而且使用起来比较麻烦,因此C++又提出了自己的内存管理方式:通过new和delete操作符进行动态内存管理


  • new/delete操作内置类型:


void Test()
{
  // 动态申请一个int类型的空间
  int* ptr4 = new int;
  // 动态申请一个int类型的空间并初始化为3
  int* ptr5 = new int(3);
  // 动态申请3个int类型的空间
  int* ptr6 = new int[3];
  int* ptr7 = new int[3]{1,2,3};//开辟并初始化
  delete ptr4;
  delete ptr5;
  delete[] ptr6;
}



image.png


  • 注意:


申请和释放单个元素的空间,使用new和delete操作符,申请和释放连续的空间,使用new[]和delete[],一定要匹配使用,否则可能出错


  • new和delete操作自定义类型:


示例:


class Test
{
public:
  Test()
    : _data(0)
  {
    cout << "Test():" << this << endl;
  }
  ~Test()
  {
    cout << "~Test():" << this << endl;
  }
private:
  int _data;
};
void Test2()
{
  // 申请单个Test类型的空间
  Test* p1 = (Test*)malloc(sizeof(Test));
  free(p1);
  // 申请10个Test类型的空间
  Test* p2 = (Test*)malloc(sizeof(Test) * 10);
  free(p2);
}
void Test3()
{
  // 申请单个Test类型的对象
  Test* p1 = new Test;
  delete p1;
  // 申请10个Test类型的对象
  Test* p2 = new Test[10];
  delete[] p2;
}


  • 注意:


在申请自定义类型的空间时,new会调用构造函数,delete会调用析构函数,而malloc与free不会

相关文章
|
14天前
|
存储 编译器 C语言
内存管理【C++】
内存管理【C++】
33 1
|
28天前
|
存储 编译器 C语言
【C++】C\C++内存管理
【C++】C\C++内存管理
【C++】C\C++内存管理
|
21天前
|
算法 C语言 C++
C++语言学习指南:从新手到高手,一文带你领略系统编程的巅峰技艺!
【8月更文挑战第22天】C++由Bjarne Stroustrup于1985年创立,凭借卓越性能与灵活性,在系统编程、游戏开发等领域占据重要地位。它继承了C语言的高效性,并引入面向对象编程,使代码更模块化易管理。C++支持基本语法如变量声明与控制结构;通过`iostream`库实现输入输出;利用类与对象实现面向对象编程;提供模板增强代码复用性;具备异常处理机制确保程序健壮性;C++11引入现代化特性简化编程;标准模板库(STL)支持高效编程;多线程支持利用多核优势。虽然学习曲线陡峭,但掌握后可开启高性能编程大门。随着新标准如C++20的发展,C++持续演进,提供更多开发可能性。
41 0
|
20天前
|
存储 JavaScript 前端开发
学习JavaScript 内存机制
【8月更文挑战第23天】学习JavaScript 内存机制
18 3
|
27天前
|
编译器 C++
virtual类的使用方法问题之C++类中的非静态数据成员是进行内存对齐的如何解决
virtual类的使用方法问题之C++类中的非静态数据成员是进行内存对齐的如何解决
|
7天前
|
C语言 C++
C++(二)内存管理
本文档详细介绍了C++中的内存管理机制,特别是`new`和`delete`关键字的使用方法。首先通过示例代码展示了如何使用`new`和`delete`进行单个变量和数组的内存分配与释放。接着讨论了内存申请失败时的处理方式,包括直接抛出异常、使用`try/catch`捕获异常、设置`set_new_handler`函数以及不抛出异常的处理方式。通过这些方法,可以有效避免内存泄漏和多重释放的问题。
|
29天前
|
存储 Java C语言
【C++】C/C++内存管理
【C++】C/C++内存管理
|
1月前
|
存储 编译器 C语言
C++内存管理(区别C语言)深度对比
C++内存管理(区别C语言)深度对比
57 5
|
22天前
|
存储 程序员 编译器
c++学习笔记08 内存分区、new和delete的用法
C++内存管理的学习笔记08,介绍了内存分区的概念,包括代码区、全局区、堆区和栈区,以及如何在堆区使用`new`和`delete`进行内存分配和释放。
35 0
|
8天前
|
存储 编译器 C++
C ++初阶:类和对象(中)
C ++初阶:类和对象(中)

热门文章

最新文章