指针(二)- C++内存模型、动态分配内存new和delete

简介: 指针(二)- C++内存模型、动态分配内存new和delete

C++内存模型

在 C++ 中,程序运行时,内存主要分成个区分别是、数据段代码段

 

  • 栈:存储局部变量函数参数和返回值。
  • 堆:储动态开辟内存的变量
  • 数据段:存储全局变量和静态变量
  • 代码段:存储可执行程序的代码常量(例如字符常量)此存储区不可修改


和堆的主要区别

1)管理方式不同:栈是系统自动管理的,在出作用域时,将自动被释放;堆需手动释放,若程序中不释放,程序结束时由操作系统回收。


2)空间大小不同:堆内存的大小受限于物理内存空间;而栈就小得可怜,一般只有8M(可以修改系统参数)。


3)分配方式不同:堆是动态分配;栈有静态分配和动态分配(都是自动释放)。


4)分配效率不同:栈是系统提供的数据结构,计算机在底层提供了对栈的支持,进栈和出栈有专门的指令,效率比较高;堆是由C++函数库提供的。


5)是否产生碎片:对于栈来说,进栈和出栈都有着严格的顺序(先进后出),不会产生碎片;而堆频繁的分配和释放,会造成内存空间的不连续,容易产生碎片,太多的碎片会导致性能的下降。


6)增长方向不同:栈向下增长,以降序分配内存地址;堆向上增长,以升序分配内存地址。

动态分配内存new和delete

使用堆区的内存有四个步骤:


1)声明一个指针;


2)用new运算符向系统申请一块内存,让指针指向这块内存;


3)通过对指针解引用的方法,像使用变量一样使用这块内存;


4)如果这块内存不用了,用delete运算符释放它。


申请内存的语法:new 数据类型(初始值);   // C++11支持{}


如果申请成功,返回一个地址;如果申请失败,返回一个空地址(暂时不考虑失败的情况)。


释放内存的语法:delete 地址;


释放内存不会失败(还钱不会失败)。


注意:

动态分配出来的内存没有变量名,只能通过指向它的指针来操作内存中的数据。

如果动态分配的内存不用了,必须用delete释放它,否则有可能用尽系统的内存。

动态分配的内存生命周期与程序相同,程序退出时,如果没有释放,系统将自动回收。

就算指针的作用域已失效,所指向的内存也不会释放。

用指针跟踪已分配的内存时,不能跟丢。

#include <iostream>         // 包含头文件。
using namespace std;        // 指定缺省的命名空间。
int main()
{
  // 1)声明一个指针;
  // 2)用new运算符向系统申请一块内存,让指针指向这块内存;
  // 3)通过对指针解引用的方法,像使用变量一样使用这块内存;
  // 4)如果这块内存不用了,用delete运算符释放它。
  // 申请内存的语法:new 数据类型(初始值);   // C++11支持{}
  // 释放内存的语法:delete 地址;
  int* p = new int(5);
  cout << "*p=" << *p << endl;
  *p = 8;
  cout << "*p=" << *p << endl;
  delete p;
  /*  for (int i = 1; i > 0; i++)
  {
    int* p = new int[100000];     // 一次申请100000个整数
    cout << "i="<<i<<",p=" << p << endl;
  }/*
}
相关文章
|
9月前
|
缓存 安全 编译器
C++面试周刊(3):面试不慌,这样回答指针与引用,青铜秒变王者
《C++面试冲刺周刊》第三期聚焦指针与引用的区别,从青铜到王者级别面试回答解析,助你21天系统备战,直击高频考点,提升实战能力,轻松应对大厂C++面试。
860 132
C++面试周刊(3):面试不慌,这样回答指针与引用,青铜秒变王者
|
9月前
|
存储 C++
C++语言中指针变量int和取值操作ptr详细说明。
总结起来,在 C++ 中正确理解和运用 int 类型地址及其相关取值、设定等操纵至关重要且基础性强:定义 int 类型 pointer 需加星号;初始化 pointer 需配合 & 取址;读写 pointer 执向之处需配合 * 解引用操纵进行。
707 12
|
10月前
|
安全 C语言 C++
比较C++的内存分配与管理方式new/delete与C语言中的malloc/realloc/calloc/free。
在实用性方面,C++的内存管理方式提供了面向对象的特性,它是处理构造和析构、需要类型安全和异常处理的首选方案。而C语言的内存管理函数适用于简单的内存分配,例如分配原始内存块或复杂性较低的数据结构,没有构造和析构的要求。当从C迁移到C++,或在C++中使用C代码时,了解两种内存管理方式的差异非常重要。
339 26
|
11月前
|
C语言 C++
c与c++的内存管理
再比如还有这样的分组: 这种分组是最正确的给出内存四个分区名字:栈区、堆区、全局区(俗话也叫静态变量区)、代码区(也叫代码段)(代码段又分很多种,比如常量区)当然也会看到别的定义如:两者都正确,记那个都选,我选择的是第一个。再比如还有这样的分组: 这种分组是最正确的答案分别是 C C C A A A A A D A B。
193 1
|
存储 Linux C语言
C++/C的内存管理
本文主要讲解C++/C中的程序区域划分与内存管理方式。首先介绍程序区域,包括栈(存储局部变量等,向下增长)、堆(动态内存分配,向上分配)、数据段(存储静态和全局变量)及代码段(存放可执行代码)。接着探讨C++内存管理,new/delete操作符相比C语言的malloc/free更强大,支持对象构造与析构。还深入解析了new/delete的实现原理、定位new表达式以及二者与malloc/free的区别。最后附上一句鸡汤激励大家行动缓解焦虑。
指针进阶(C语言终)
指针进阶(C语言终)
|
存储 C语言
C语言如何使用结构体和指针来操作动态分配的内存
在C语言中,通过定义结构体并使用指向该结构体的指针,可以对动态分配的内存进行操作。首先利用 `malloc` 或 `calloc` 分配内存,然后通过指针访问和修改结构体成员,最后用 `free` 释放内存,实现资源的有效管理。
1800 13
|
存储 人工智能 C语言
C语言程序设计核心详解 第八章 指针超详细讲解_指针变量_二维数组指针_指向字符串指针
本文详细讲解了C语言中的指针,包括指针变量的定义与引用、指向数组及字符串的指针变量等。首先介绍了指针变量的基本概念和定义格式,随后通过多个示例展示了如何使用指针变量来操作普通变量、数组和字符串。文章还深入探讨了指向函数的指针变量以及指针数组的概念,并解释了空指针的意义和使用场景。通过丰富的代码示例和图形化展示,帮助读者更好地理解和掌握C语言中的指针知识。
804 4
|
C语言
无头链表二级指针方式实现(C语言描述)
本文介绍了如何在C语言中使用二级指针实现无头链表,并提供了创建节点、插入、删除、查找、销毁链表等操作的函数实现,以及一个示例程序来演示这些操作。
251 0
|
编译器 C语言
【C语言初阶】指针篇—下
【C语言初阶】指针篇—下