专题一:为指针分配和释放空间

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第二点注意: 已释放的空间,不可重复释放
第一种错误情况:
int* p = new int(71); cout << *p << endl;
delete p; //OK! delete p; //ERROR! 重复删除p
如果同一指针在delete之后,又通过new 或 new[] 分配了一次内存,则需要再删除一次。
new 和 delete 的关系
如果只有“建房”而没有“拆房”,那么程序就会占 用内存越来越多。所以,当使用new 为某个指针分配出 内存空间后,一定要记得在不需要再使用时,用delete 删除。 1) int* p = new int(100); 2) cout << *p << endl; 3) delete p; //建屋和入住 //使用 //拆

分配与释放连续多个变量的空间 new[]和delete[]
• new / delete 用于分配和释放单个变量 的空间。 int* p = new int(100); delete p; • new [] / delete[] 则用于分配连续多 个变量的存间。 int* p = new int[100]; delete [] p;
int* p = new int(71); cout << *p << endl; delete p; //OK! ...
p = new int(81); delete p; //OK! ... p = new int[10]; for (int i=0; i<10; i++) p[i] = i; ... delete [] p; //OK!
*pPointer=84;
实战篇:
小赵老师成绩管理系统
进入
THE END.
THANK YOU!
C++ 方式的内存分配与释放 new 和 delete
• new,从字面上看意思为 “新”; • delete 字面意思为“删除”。 二者在C++中内存管理中大致的功能,一 个为“新建”,一个为“删除”。
new
new 是 c++ 的一个关键字,其操作结果是申请到一段指定 数据类型大小的内存。 语法: 指针变量 = new 数据类型;
int* p = new int[3]; *p = 1; cout << *p << endl; p++; //p的指向改变了,指向了下一元素 *p = 2; 第一个元素没有被 cout << *p << endl; 释放,而在最后多 delete [ ] p; //错误的释放
删除了一个元素。
解决办法
指向原有的某个变量,和指向一段新分配的内 存空间,有什么区别呢?
指向原有的某个变量,和指向一段新 分配的内存空间,有什么区别呢? “原有的变量”,可以比喻成指向一间原 有的,并且有主的房间。而“新分配的内 存空间”,则像是一个“临时建筑物”。 我们必须在不用它的时候,主动将它拆迁。 拆迁的工作由delete来完成。
内存泄露
• 可能造成内存泄露的情况: 在没有删除一个指针之前就对其重新赋值。
unsigned short int *pPointer=new unsigned short int; *pPointer=72;
delete pPointer;
pPointer=new unsigned short int;
如何消除这一严重错误呢?
一种方法是把指针正确地"倒"回原始位置: p--; delete [] p; 另一种方法是在最初时“备份”一份。在释放 时,直接释放该指针即可。 int* p = new int[3]; int* pbak = p; //备份 //移动 p delete [] pbak; //释放
第二种错误情况,重复删除同一指向的多 个指针
int* p1 = new int(71); int* p2 = p1; //p2和p1 现在指向同一内存地址 cout << *p1 << endl; cout << *p2 << endl; delete p1; //OK delete p2; //ERROR! p2所指的内存,已通过 delete p1而被释放,不可再delete一次。
int* p; p = new int;
new 将做三件事: 1、主动计算指定数据类型需要的内存空间大小; 2、返回正确的指针类型; 3、将按照语法规则,初始化所分配的内存。
int* p; p = new int;
p 不是指向某个已存在的变量,而是直接指向一段由new 分配而来的新内存空间。
“p 指向一段由new 分配而来的新内存空间” 这句话等同 于: “new 分配一段新的内存空间,然后将该内存空间的地址 存入到变量p中。” p中仍然是存储了一个变量的地址,只是,这是一个“无 名”变量。
new[] / delete[] 基本用法
• new [] 语法: 指针变量 = new 数据类型[元素个数] int* p = new int[20];
//用 new 申请分配了20个连续的整数所需的空 间,即:20 * sizeof(int) = 80个字节。
注意: • delete [] 语法: delete [] 指针变量; 使用 new 得来的空间,必须用 delete 来释放; delete [ ] p;
/*p 改变指向 ---- 分手*/
int girl [100]; p = girl;
//第三者出现 //p 就这样指向 girl
/*终于有一天,p老了,上帝选择在这一时惩罚他*/
delete [] p; 灾难降临!
P释放的是谁的空间?
第一点注意: 一个指针被删除时,应指向最初的地址
当一个指针通过 +,- 等操作而改变了指向; 那么在释放之前,应确保其回到原来的指向。
语法: 指针变量 = new 数据类型(初值);
int * p = new int(100); cout << *p << endl; 如果申请的是字符类型的空间,并且 想初始化为‘A': char * pchar = new char('A');
delete
语法: delete 指针变量; delete 将释放指定指针所指向的内存空间。 举例:
彼此之间不能混用。
使用 new [] 得来的空间,必须用 delete [] 来释放。
比 较
比 较
delete/delete[]的两点注意事项
/*初始化 p 指针p。*/ ----- p 的新婚。通过 new ,将一段新建的内存“嫁给”
int* p = new int[100];
/* N 多年恩爱相处*/
●改变指针的值
●改变指针所指的变量的值
改变指针的值
“改变指针的值”引起的结果是什么? 其实就是“改变指针的指向”。 指针的值是某个变量的地址。假如指针P原来的值是A变量 的地址,现在改为B变量的地址。我们称为:“P由指向A改 为指向B”。这就是指针的第一种改变。 以下是示例代码: int* P; int A,B; 1) P = &A; 2) ... 3) P = &B;
int* p; p = new int; *p = 100; cout << *p << endl; delete p; //当一个指针接受delete操作后,它又
成了一个“指向不明”的指针。
思考:
下列代码能通过编译吗?
#include <iostream.h> void main() { int* p; p = new int; *p = 100; cout << *p << endl; delete p; cout << *p << endl; }
第1句,申请了4字节的内存空间,同时存入值为100的整数。 第2句,在屏幕上输出入住者的值 (100)。 第3句,释放内存(这4字节被系统收回准备做其它用途)。 入住者呢?自然消失了。
其他类型举例

char* a = new char('A'); cout << *a << endl; *a = 'B'; cout << *a << end; delete a; bool* b = new bool; *b = true; if (*b) cout << "true" << endl; else cout << "fale" << endl;
在new时初始化内存的值
当指针变量通过 new , 而得到一个内存地址后, 该指针通过*号,而对该 内存地址(一个无名的 变量),进行操作。 如: int * p = new int; *p = 100; cout << *p << endl; new 也可以在申请内存空间时,直 接设置该段内存里要放点什么.
第三种情况,删除指向某一普通变量的指 针
int a = 100; int* p = &a; delete p; //ERROR p 不是通过new 得到新的内存空间,而是直接指向固 定变量:a。所以删除p等同要强行剥夺a的固有空间, 会导致出错。
例1
分配ቤተ መጻሕፍቲ ባይዱ使用和删除指针
#include <iostream.h> int main() { int localVariable = 5; int * pLocal= &localVariable; int * pHeap = new int; *pHeap = 7; cout << "localVariable: " << localVariable << endl; cout << "*pLocal: " << *pLocal << endl; cout << "*pHeap: " << *pHeap << endl; delete pHeap; pHeap = new int; *pHeap = 9; cout << "*pHeap: " << *pHeap << endl; delete pHeap; return 0;
专题一: 为指针分配和释放空间
• 理解指针的两种“改变” • C++ 方式的内存分配与释放: new 和 delete • 分配与释放连续多个变量的空间: new[]和delete[] • delete/delete[]的两点注意事项
理解指针的两种“改变”
普通变量(非指针,简单类型变量): 1) int a = 100; 2) ... 3) a = 200; 第 1 行代码,声明int类型变量a,并且初始化a的值为100。 到第 3 行代码,变量a的值被改变成200。 对于非指针的简单变量,能被程序改变的,只有这一种。 而指针变量,似乎有两种改变。
改变指针所指的变量的值
int* P; int A = 100; P = &A; *P = 200; cout << A << endl;
*P = 200; ,其作用完全等同于:A = 200; 所以,最后一行输出的结果是 200。 这就是指针的第二种改变:所指变量的值,被改变了。
思考:
“指针的加减操作”(P++),是对指针 的哪一种改变?
相关文档
最新文档