IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> c++动态内存基础 -> 正文阅读

[C++知识库]c++动态内存基础

本章博客参考 c++ primer ,希望更好的复习

前言

c/c++程序为什么需要动态内存呢?
由于作者知识有限,请大家不妨看看这篇文章,写的很清晰的
c/c++ 为什么需要动态内存分配

好了,大家在了解了动态内存的重要性后,也是要迫不急待的使用动态内存里,我们以c++的new 和delete这两个表达式来说一说动态内存的基本知识。

使用new初始化对象

对于c++程序来说,初始化变量很重要,我们一定要养成初始化的好习惯! (有的编译器甚至会直接报错!使用未初始化的变量

在自由空间(堆区)分配的对象是无名的,我们需要一个指针去接受它的地址,进而对地址操作(达到了操作这个地址上的值的目的)
默认情况下,内置类型的对象是默认初始化的,因此它们的值是未定义的,类的对象使用默认构造函数,来看代码:

 //在自由空间分配的内存是无名的,因此new无法为其分配对象命名,而是返回指向该对象的指针
	     //p 是一个指向动态分配的,未初始化的无名对象 
	    int* p=new int;//默认初始化 ,不提倡 
	    string* q=new string ; //类使用默认构造函数 

我们可以使用直接初始化的方式,在c++11下,也可以使用列表初始化,来看代码:

 int* p1=new int(1024); //直接初始化
string* p2=new string(10,'q');//直接初始化,使用类的构造函数
vector<int>* p3=new vector<int>{1,2,3,4,5};//直接初始化,以列表的形式进行,又叫列表初始化 

我们也可以使用值初始化的方式,我们需要在类型的后面加上一对空 (),初始化动态内存分配的对象,
但这样对类类型是无用的,它会使用自己的默认构造函数,指向的是一个 空的内容!

			
	//对动态分配的对象进行值初始化在类型名后加()即可
	string* q1=new string( ); //进行值初始化 ,为空string ,不提倡 
	int* q3=new int ();//进行值初始化,q3指向的值为0 
						

我们可以使用auto 来帮助行类型推断,我们需要在类型的后面加上一对空 ()

	//提供(),我们可以使用auto ,帮助我们推断类型
		 int a=20;
		auto p4=new auto (a);//使用a 初始化p4 指向与a 同类型的对象

动态分配const 对象也是可行的,我们可以要知道分配const的对象一定是要进行初始化的!

	//动态分配const 对象
						
const string* p5=new const string("hello");//分配并使用string的构造函数初始化一个const string
						
						

delete

对于分配好的动态内存,使用完之后,一定要及时释放掉,将这片内存归还给操作系统,因为是程序员来决定动态内存的生存期,如果我们不主动释放这片内存的话,它会随着程序的运行一直存在,如果堆区没有空间可以分配了呢,这就会造成内存耗尽

c++提供了delete表达式来将申请的动态内存归还给操作系统

  delete p //p 要指向动态分配的内存或者是空指针

new 和数组

大多数的时候我们还是使用很多值的操作的时候,我们就有必要了解new和数组的操作了。
来看代码:

//调用get_size()的到多少个int  
	  int* p=new int[get_size()];//p指向第一个int

方括号的值必须为整形·,但不必为常量。

我们可以使用数组类型的别名来分配动态内存:

	//使用typedef 定义数组别名 
	typedef int arr[42]; //arr表示42个int类型的数组类型 
	int* q=new arr; //分配一个42int类型的数组,q指向第一个int

分配动态数组时,我们实际只是得到这种类型的指针!所以以下的注意很重要

注意: 这里讲的动态数组不是数组的一种类型,这只是个叫法。
我们不能对动态数组使用begin,end迭代器操作,基于范围的for循环也不行

初始化动态分配的数组:
我们可以对分配的数组进行值初始化,我们需要在类型的后面加上一对空 (),在新标准下,我们可以使用列表初始化的方式:

//初始化动态分配的数组
	//可对数组进行值初始化,在后面加上()
	int* q1=new int[10]();//进行值初始化,10个值为0
	//也可以进行列表初始化
	int* q2=new int[10]{1,2,3,4,5,6,7,8}; 

动态分配一个空数组的时候是合法的吗?

虽然我们不能创建一个大小为0的静态数组,但是我们可以动态分配一个大小为0的动态数组!

char* p=new char [0] //OK ,但是不能解引用!

如前面说的一样,使用好的动态数组我们作为程序员要主动释放掉:

delete [] p // p必须指向一个动态分配的数组或则是空指针

好了,博客就到这了,
大家多多练习。

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-09-11 18:37:21  更:2021-09-11 18:39:39 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 20:34:54-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码