2019.8.15C++基础学习笔记——动态内存分配
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了2019.8.15C++基础学习笔记——动态内存分配,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2404字,纯文字阅读大概需要4分钟。
内容图文
C++基础学习笔记——动态内存分配
C++中所有内存需求都是在程序执行之前通过定义所需的变量来确定的。 但是可能存在程序的内存需求只能在运行时确定的情况。 例如,当需要的内存取决于用户输入。 在这些情况下,程序需要动态分配内存,C ++语言将运算符new和delete合成在一起。
new分配动态内存
关键字new根据变量类型来分配内存,分配使用完变量后用关键字delete释放内存。
new语法:Type* 变量名 = new Type;
分配数组:Type* 变量名 = new Type[元素数];
分配数组中元素数也可以是由用户自己输入的变量。
测试实例:
#include <iostream>
using namespace std;
int main()
{
int* a = new int; //为a分配整型动态内存
int n;
cin >> n; //输入分配的数组内存,n=3
char* b = new char[n]; //为b分配字符数组类型内存,数组容量为n
cin >> *a; //从键盘输入为a赋值
cin >> *b;
cin >> b+1;
cin >> b+2; //从键盘输入依次为b数组赋值
cout << endl <<“a=” << a << endl; //输出a为a指向数据的地址
cout << *a <<"*a=" << endl; //输出*a为a指向数据的值
cout << "b=" << b << endl; //输出整个数组
cout << "b[0b[1]b[2]=" << ]b[0] << "next" << b[1] << b[2] << endl;
cout << "*b*(b+1)*(b+2)=" << *b << "next" << *(b+1) << *(b+2) << endl;
//输出数组元素可以有两种方式
delete a;
delete[] b; //使用变量后要释放内存
system("pause");
return 0;
}
输入:3 1 2 3 4
输出:a=00044ED0
*a=1
b=234
b[0]b[1]b[2]=2next34
*b*(b+1)*(b+2)=2next34
P.S.在测试中发现对b数组元素赋值时cin >> b语句和cin >> *b语句似乎都能赋值成功,结果输出相同,语句实现是否一致存疑。
关键字new可对分配内存的变量进行初始化,关键字malloc则不能。
关键字new初始化语法:
int* pi = new int(1);
float* pf = new float(2.0f);
char* pc = new char('c');
new与malloc比较:
new | malloc |
---|---|
new以具体类型为单位进行内存分配 | malloc以字节为单位进行内存分配 |
new在申请单个类型变量时可进行初始化 | malloc不具备内存初始化的特性 |
new关键字是C++的一部分 | malloc是由C库提供的函数 |
C++动态分配内存异常机制
计算机内存优先,如果分配一个很大的内存空间,会出现栈满,程序产生异常,程序崩溃。所以我们需要引入异常机制。C ++提供了两种标准机制来检查分配是否成功。
第一种是new默认自带的异常处理方法,使用此方法,在分配失败时抛出bad_alloc类型的异常。如果程序分配内存失败抛出此异常并且未由特定处理程序处理,则程序执行将终止。
Type* 变量名 = new Type;//new定义语句自带异常处理,分配失败会退出程序
第二种方法是nothrow,在使用关键字new时加参数,在分配内存失败时不会默认直接自动终止,而是返回一个空指针。在调试时可以使用nothrow方法判定指针是否为空来确定内存分配是否成功。
int * a;
a = new (nothrow) int [5]; //使用nothrow方法
if (a == nullptr) //判定返回是否为空指针
{
// 内存分配错误
}
内容总结
以上是互联网集市为您收集整理的2019.8.15C++基础学习笔记——动态内存分配全部内容,希望文章能够帮你解决2019.8.15C++基础学习笔记——动态内存分配所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。