C/C++学习——动态分配内存

new与delete运算符

一:c++内存分配有两种方式:静态分配和动态分配
1、静态分配:在编译时为程序中的数据对象分配相应的存储空间。
由于实在编译时为数据对象分配存储空间,因此就要求在编译时空间大小必须明确,所以数组的长度必须是常量,而一旦编译完成,运行期间这个数组的长度就是固定不变的。
2、动态分配:程序运行期间根据实需要动态地申请或释放内存的方式,他不象数组等静态内存分配方式那样需要预先分配存储空间,而是根据程序的需要适时分配,且分配的大小就是程序要求的大小。
(1)不需要预先分配存储空间;
(2)分配的空间可以根据程序的需要扩大或缩小。
二、

    int *p1, *p2;
	char *pz1, *pz2;
	p1 = new int;//分配一个整型空间,若成功则p1指向该空间,否则p1为NULL
	p2 = int(10);//分配一个整型空间,且给这个整型赋初值10,即*p2为10;
	pz1 = new char[80];//分配一个字符数组(字符串)空间,即pz1为字符串指针
	pz2 = new char[5][80];//分配一个二维字符数组(字符串数组)空间,即pz2为字符串数组指针
	delete p1;//释放p1指向的整型空间
	delete[] pz1;//释放pz1指向的字符串空间

1、new运算结果是指向分配得到的内存空间的指针,如果没有足够的内存空间可以分配,其运算结果是一个0值指针。
2、销毁对象后。指针p1变成没有定义,然后他仍然存放先前所指向的对象(已销毁)的地址,因此指针p1不在有效,称这样的指针为迷途指针。通常在delete运算之后,将指针重设为0指针,避免迷途指针。
3、用new创建的动态对象使用完后,必须用delete销毁他。
4、delete只能删除由new创建的动态对象,否则将导致程序错误。
三、动态内存的应用
1、静态内存管理由编译器进行,程序员制作对象定义(相当于分配),而动态内存管理按程序员人为的指令进行。
2、动态分配和释放必须对应,即有分配就必须有释放,不释放内存会产生内存泄漏,后果是随着程序的运行多次,可以使用的内存空间越来越少;另一方面,再次释放已经释放的内存空间,会导致成程序出现崩溃性错误。
3、静态分配内存的生命期由编译器自动确定,要么是程序运行期,要么是函数执行期。动态分配内存的生命期由程序员决定,即分配时开始,至释放时结束。特别的,动态分配内存的声明期允许跨多个函数。
4、静态分配内存的对象有初始化,动态分配内存一般需要人为的指令赋初始值。
5、避免释放内存后出现“迷途指针”,应及时设置为空指针。
示例:

#include <iostream>

using namespace std;

int *f1(int n)//分配n个整型内存,返回首地址
{
	int *p, i;
	p = new int[n];//分配
	for (i = 0; i < n; i++) p[i] = i;//赋初始值
	return p;//动态分配的指针返回是有意义的
}

void f2(int *p, int n)//输出动态内存中的n个数据
{
	while (n-- > 0) cout << *p++ << " ";
}
void f3(int *p)
{
	delete[] p;//释放内存空间
}
int main()
{
	int *pi;
	pi = f1(5);//分配
	f2(pi, 5);//输出
	f3(pi);//释放
	return 0;
}

四、动态分配数组
计算N*N二维数组的元素的平均值

#include <iostream>

using namespace std;

double AVE(double *A, int N)
{
	int i, j, sum = 0;
	for (i = 0; i < N; i++)
	{
		for (j = 0; j < N; j++)
		{
			sum = sum + *(A + i * N + j);
		}
	}
	return sum / (N*N);
}
int main()
{
	int i, j, n = 4;
	cin >> n;
	double *A = new double[n*n];//动态分配数组A[n][n];
	//double *a = new double[n];//动态分配数组A[n];
	for (i = 0; i < n; i++)
	{
		for (j = 0; j < n; j++)
		{
			cin >> *(A + i * n + j);//输入数据的到A[i][j];
		}
	}
	cout << "detA=" << AVE(A, n) << endl;
	delete[] A;//释放数组
	return 0;
}

五、动态分配字符串

char *p=new char[1000];//动态分配字符串空间
cin>>p;//输入字符串
cout<<p;//输出字符串
delete[] p;//释放字符串空间
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值