C++动态内存分配

new关键字

数组的长度是预先定义好的,在整个程序中固定不变。

C++ 不允许定义元素个数不确定的数组。例如:

int n;
int a[n]; // 这种定义是不允许的

概念

大部分的实际情况中数组的长度要么太大要么太小,很少使用得刚刚好!

为了解决上述问题,C++ 提供了一种“动态内存分配”机制,使得程序可以在运行期间,根据实际需要,要求操作系统临时分配一

片内存空间用于存放数据。此种内存分配是在程序运行中进行的,而不是在编译时就确定的,因此称为“动态内存分配”(操作系统中学过)。

在 C++ 中,通过 new 运算符来实现动态内存分配。

语法1:

T *p = new T;	// 其中,T 是任意类型名,p 是类型为 T* 的指针。

// 这样的语句会动态分配出一片大小为 sizeof(T) 字节的内存空间,并且将该内存空间的起始地址赋值给 p。
// 例如:
int* p;
p = new int;	// 这句动态分配了一片4个字节大小(int)的内存空间,而 p 指向这片空间。通过 p 可以读写该内存空间。
*p = 5;

// 注意了,int* p和int *p都可以,看个人喜好。不过int* a, b 容易误会。

语法2:

用来动态分配一个任意大小的数组。

// C++写法
T *p = new T[N];
// 对比下C语言的写法
T *p = (T *)malloc((N) * sizeof(T));

// 其中,T 是任意类型名,p 是类型为 T* 的指针,N 代表“元素个数”,可以是任何值为正整数的表达式,表达式中可以包含变量、函数调用等。
// 这样的语句动态分配出 N × sizeof(T) 个字节的内存空间,这片空间的起始地址被赋值给 p。

分析下下面的伪代码:

int* pn;
int i = 5 ;
pn = new int[i*20];
pn[0] = 20 ;
pn[100] = 30;

最后一行编译时没有问题,但运行时会导致数组越界。因为上面动态分配的数组只有 100 个元素,pn[100] 已经不在动态分配的这片内存区域之内了。

如果要求分配的空间太大,操作系统找不到足够的内存来满足,那么动态内存分配就会失败,此时程序会拋出异常。


delete关键字

程序从操作系统动态分配所得的内存空间在使用完后应该释放,交还操作系统,以便操作系统将这片内存空间分配给其他程序使

用。C++ 提供 delete 运算符,用以释放动态分配的内存空间。

语法1

delete p;	//p 是指向动态分配的内存的指针。

// p 必须指向动态分配的内存空间,否则运行时很可能会出错。
// 例如:
int* p = new int;
*p = 5;
delete p;
delete p; //本句会导致程序出错
// 上面的第一条 delete 语句正确地释放了动态分配的 4 个字节内存空间。
// 第二条 delete 语句会导致程序出错,因为 p 所指向的空间已经释放,p 不再是指向动态分配的内存空间的指针了。


语法2

delete[] p;	// p 依然是指向动态分配的内存的指针。

// 例如:
int* p = new int[20];
p[0] = 1;
delete[] p;
// 同样地,要求被释放的指针 p 必须是指向动态分配的内存空间的指针,否则会出错。

如果动态分配了一个数组,但是却用delete p的方式释放,没有用[],则编译时没有问题,运行时也一般不会发生错误,但实际

上会导致动态分配的数组没有被完全释放。


需要注意的地方

  • 释放一个指针,并不会使该指针的值变为 NULL。
  • 用 new 运算符动态分配的内存空间,一定要用 delete 运算符释放。否则,即便程序运行结束,这部分内存空间仍然不会被操作系统收回,从而成为被白白浪费掉的内存垃圾。这种现象也称为“内存泄露”。
  • 如果一个程序不停地进行动态内存分配而总是没有释放,那么可用内存就会被该程序大量消耗,即便该程序结束也不能恢复。这就会导致操作系统运行速度变慢,甚至无法再启动新的程序。但是,只要重新启动计算机,这种情况就会消失。

本篇博客参考的原文链接:感谢原作者的学习资料

  • 7
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

努力的clz

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值