C++ 动态分配 和 内存分配和内存释放
2024-08-25 20:53:38
动态分配
动态分配可以说是指针的关键所在。不需要通过定义变量,就可以将指针指向分配的内存。也许这个概念看起来比较模糊,但是确实比较简单。下面的代码示范如何为一个整数分配内存:
int *pNumber; pNumber = new int;
第一行申明了一个指针pNumber,第二行分配一个整数内存,并且将pNumber指向这个新内存。下面是另一个例子,这次用一个浮点数:
double *pDouble; pDouble = new double;
动态分配有什么不同的呢?当函数返回或者程序运行到当前块以外时,你动态分配的内存将不会被删除。因此,如果我们用动态分配重写上面的例子,可以看到现在能够正常工作了。
#i nclude <stdio.h> int *pPointer; void SomeFunction() { // make pPointer point to a new integer pPointer = new int; *pPointer = 25; } void main() { SomeFunction(); // make pPointer point to something printf("Value of *pPointer: %d/n", *pPointer); }
通读一遍,编译上面的代码,确信你已经理解它是如何工作的。当调用SomeFunction时,分配了一些内存,并且用pPointer指向它。这次,当函数返回时,新内存就完整无缺了。因此pPointer仍旧指向有用的东西。这是因为使用了动态分配。确信你已经理解它了。那么继续向下看,了解为什么上面的程序还会有一系列的错误。
内存分配和内存释放
这里有一个问题,可能会变得十分严重,虽然它很容易补救。这个问题就是,虽然你用动态分配可以方便的让内存完整无缺,确实不会自动删除,除非你告诉计算机,你不再需要这块内存了,否则内存将一直被分配着。因此结果就是,如果你不告诉计算机你已经使用完这块内存,那么它将成为被浪费的空间,因为其它程序或者你的应用程序的其它部分不能使用这块内存。最终将导致系统因为内存耗尽而崩溃。因此这个问题相当重要。内存使用完后释放非常容易:
delete pPointer;
需要做的就是这些。但是你必须确定,你删除的是一个指向你实际分配的内存的指针,而不是其它任何垃圾。尝试用delete已经释放的内存是危险的,并且可能导致程序崩溃。
这里再次举个例子,这次修改以后就不会有内存浪费了。
#include <stdio.h> int *pPointer; void SomeFunction() { // make pPointer point to a new integer pPointer = new int; *pPointer = 25; } void main() { SomeFunction(); // make pPointer point to something printf("Value of *pPointer: %d/n", *pPointer); delete pPointer; } int * p = new int;
* p = 5;
delete p; int * p2 = new int[5];
* p2 = 5;
delete[] p2;
最新文章
- 从零开始学 Java - Spring MVC 统一异常处理
- jQuery.fn.extend() 与 jQuery.extend()
- [转]逻辑斯蒂回归 via python
- CentOS 6.4下编译安装 gcc-4.8.0(转)
- AC自动机(1)
- Jquery实现图片的预加载与延时加载
- #-webkit-autofill##google#启用表单自动填充时,如何覆盖黄色背景
- 使用SQL Server 2005作业设置定时任务
- IOS_OC_本地推送知识总结
- ZOJ-3410Layton&#39;s Escape(优先队列+贪心)
- 记WebUtility.HtmlDecode将&;nbsp;转成特殊空格的问题
- go的生产者-消费者模式
- 中兴F660光猫改桥接
- windows集群简单介绍
- 52ABP模板 ASP.Net Core 与 Angular的开源实例项目
- Java 引用数据类型
- 微信小程序~wx.getUserInfo逐渐废弃,小程序登录过程将如何优化?
- Jenkins实现自动化部署
- Axure RP 快速原型设计工具
- 《GPU高性能编程CUDA实战》附录二 散列表