14~C++动态内存

1. C++ 动态内存分配简介

C++ 动态内存分配 使用new运算符函数实现, 其动态内存释放使用delete运算符函数实现

new:
早期C++编译器:
new运算符成功分配内存返回非空指针,失败返回空指针
现代C++编译器:
new运算符成功分配成功返回非空指针,失败抛出异常(异常后续说明)

为了避免兼容性问题,现代C++编译器支持new运算不抛出异常,如下


#include <iostream>
using namespace std;


int main(void)
{

int* p = new(std::nothrow) int;
cout << "p = " << p << endl;
return 0;
}

2. 程序举例

delete:
传给一个空指针给delete是不会出错的,同C语言中的free类似

2.1 基本数据类型的动态分配释放

#include <iostream>
using namespace std;
#include <iostream>
using namespace std;

int main(void)
{
	//使用new ,同时初始化
	int *pa = new int(99);
	double  *pd = new double(99.9);
	
	//使用new,但是不给初始值
	int *pb = new int;
	char *pc = new char;
	*pb  = 99;
	*pc = 'c';

	cout << *pa << " "<<*pb <<  " " << *pc << " "<< *pd << endl;
	delete pa;
	delete pb;
	delete pc;
	delete pd;
	return 0;
}

输出
99 99 c 99.9

2.2 使用基本类型与数组

#include <iostream>

int main()
{
	int *pa = new int[3]  {66,88,99};
	char *pc = new char[3]  {'a','b','c',};
	
	double *pd = new double[3];

	using namespace std;
	cout << pa[0] << ' ' << pa[1] << ' ' << pa[2] << endl;
	cout << pc[0] << ' ' <<  pc[1] << ' ' << pc[2] << endl;
	
	delete [] pa;
	delete [] pc;	
	delete [] pd;

	return 0;		
} 

输出:
66 88 99
a b c

2.3 通常把指针设置为NULL,因为不会有什么风险

#include <iostream>
int  main()
{
	int *pa = NULL;
	delete pa;
	return 0;
}

2.4 多次释放同一块内存

//doublefree.cpp
#include <iostream>

int main(void)
{	
	int *pa = new int;
	
	delete pa;
	//再delete一次
	delete pa;

	return 0;
}
//doublefree.c
#include <cstdlib>
int main(void)
{
	int *pa  = (int*) malloc(sizeof(int) * 10);
	
	free(pa);
	free(pa);
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值