指针(二)- 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;
  }/*
}
相关文章
|
14天前
|
缓存 算法 Java
本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制
在现代软件开发中,性能优化至关重要。本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制。通过调整垃圾回收器参数、优化堆大小与布局、使用对象池和缓存技术,开发者可显著提升应用性能和稳定性。
36 6
|
13天前
|
存储 编译器 Linux
【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)
本文介绍了C++中的类和对象,包括类的概念、定义格式、访问限定符、类域、对象的创建及内存大小、以及this指针。通过示例代码详细解释了类的定义、成员函数和成员变量的作用,以及如何使用访问限定符控制成员的访问权限。此外,还讨论了对象的内存分配规则和this指针的使用场景,帮助读者深入理解面向对象编程的核心概念。
38 4
|
29天前
|
存储 安全 编译器
在 C++中,引用和指针的区别
在C++中,引用和指针都是用于间接访问对象的工具,但它们有显著区别。引用是对象的别名,必须在定义时初始化且不可重新绑定;指针是一个变量,可以指向不同对象,也可为空。引用更安全,指针更灵活。
|
1月前
|
程序员 C++ 容器
在 C++中,realloc 函数返回 NULL 时,需要手动释放原来的内存吗?
在 C++ 中,当 realloc 函数返回 NULL 时,表示内存重新分配失败,但原内存块仍然有效,因此需要手动释放原来的内存,以避免内存泄漏。
|
1月前
|
存储 C语言 C++
【C++打怪之路Lv6】-- 内存管理
【C++打怪之路Lv6】-- 内存管理
40 0
【C++打怪之路Lv6】-- 内存管理
|
6天前
|
存储 编译器 C++
【c++】类和对象(下)(取地址运算符重载、深究构造函数、类型转换、static修饰成员、友元、内部类、匿名对象)
本文介绍了C++中类和对象的高级特性,包括取地址运算符重载、构造函数的初始化列表、类型转换、static修饰成员、友元、内部类及匿名对象等内容。文章详细解释了每个概念的使用方法和注意事项,帮助读者深入了解C++面向对象编程的核心机制。
28 5
|
12天前
|
存储 编译器 C++
【c++】类和对象(中)(构造函数、析构函数、拷贝构造、赋值重载)
本文深入探讨了C++类的默认成员函数,包括构造函数、析构函数、拷贝构造函数和赋值重载。构造函数用于对象的初始化,析构函数用于对象销毁时的资源清理,拷贝构造函数用于对象的拷贝,赋值重载用于已存在对象的赋值。文章详细介绍了每个函数的特点、使用方法及注意事项,并提供了代码示例。这些默认成员函数确保了资源的正确管理和对象状态的维护。
40 4
|
1月前
|
存储 编译器 对象存储
【C++打怪之路Lv5】-- 类和对象(下)
【C++打怪之路Lv5】-- 类和对象(下)
27 4
|
1月前
|
编译器 C语言 C++
【C++打怪之路Lv4】-- 类和对象(中)
【C++打怪之路Lv4】-- 类和对象(中)
25 4
|
1月前
|
存储 安全 C++
【C++打怪之路Lv8】-- string类
【C++打怪之路Lv8】-- string类
22 1