指针⑶,new和delete
2006-12-08 09:22
288 查看
课堂内容:指针⑶,new和delete
重点:
1.内存空间的动态分配:
一般来说,内存分为5个区,从上到下依次为:栈区,空闲区,堆区,代码区,系统区。
或者说可以分为:
┏───┯───┑
│ 代 │ 栈区│
│ 码 │ 堆区│ 敲的累.....
│ 区 │ 全局│
┕───┻───┛
↑ ↑
代码区 数据区
代码区存放程序的执行代码.
栈区存放局部数据区,我们把变量放在这里.
堆区存放动态内存,供程序随即申请使用.
全局数据区存放全局数据、常量、文字量、静态全局量和静态局部量.
注 意:我们为一个指针开辟动态空间,用到new的时候这里是在堆区存放的,但是我们马上要学的函数和指针的关系,指向函数的指针是指向代码区的,这种指针是 函数指针.所以今天的作业里面,我们没在main函数中调用外部函数排序,而是在main函数中直接排序,就是这个道理.
2.malloc/free和calloc/free函数:
这两个函数是在C语言中的,C++中我们使用new和delete来代替.为什么会有这两个函数?老师也只讲了如何使用new和delete,但是这起到什么作用?首先我们来看看什么叫链表.
链表是一种重要的数据结构,是我们动态分配存储的结构.比如说我们知道在定义数组时,我们需要给它一个大小.
int nArr[10] = {0}正确
int nArr[];错误,因为没有给它一个空间大小.
那么我们一开始不知道数组的大小,我们需要输入才知道输入了多少个元素,如果我们定义了100个元素,结果只输入了10个,那么就浪费了很大的空间.在数组中是无法解决这个问题的,我们可以通过链表来解决这个问题.
链表就是一串连接起来的变量.一个连一个,但是这些变量都可以随即在内存中存放,通过指针来进行连接.(具体细节和链表的详细介绍在我们讲了链表操作的时候再写.)链表的优点就是不会浪费内存.
如何来给这个链表开辟空间?在C语言中就要用到malloc/free和calloc/free函数,在C++中要用到new和delete.
3.new和delete的具体使用:
new和delete是操作符,定义的一般形式为:
int* pInt = new int ;
↑ ↑ ↑ ↑
类型名 指针变量 new 类型.
delete pInt
这样就释放掉了空间.
int* pA = new int的几个步骤
第1步,看类型,int或char,用sizeof查看需要开辟什么样的多少长度的空间。
第2步,将正确类型返回到指针。
第3步,按照编译器的规则为指针开辟内存空间。
这里
int* pA = new int ;
*pA = 5;
这两句和
int* pA = new int(5);
是一个效果.
但是这种情况
int* pA = new int[5];
int nArr[5] = {0};
delete pA;//这样的释放是错误的,虽然不报搓,但是很不规范
delete[] pA;//这样才是全部释放
重点:
1.内存空间的动态分配:
一般来说,内存分为5个区,从上到下依次为:栈区,空闲区,堆区,代码区,系统区。
或者说可以分为:
┏───┯───┑
│ 代 │ 栈区│
│ 码 │ 堆区│ 敲的累.....
│ 区 │ 全局│
┕───┻───┛
↑ ↑
代码区 数据区
代码区存放程序的执行代码.
栈区存放局部数据区,我们把变量放在这里.
堆区存放动态内存,供程序随即申请使用.
全局数据区存放全局数据、常量、文字量、静态全局量和静态局部量.
注 意:我们为一个指针开辟动态空间,用到new的时候这里是在堆区存放的,但是我们马上要学的函数和指针的关系,指向函数的指针是指向代码区的,这种指针是 函数指针.所以今天的作业里面,我们没在main函数中调用外部函数排序,而是在main函数中直接排序,就是这个道理.
2.malloc/free和calloc/free函数:
这两个函数是在C语言中的,C++中我们使用new和delete来代替.为什么会有这两个函数?老师也只讲了如何使用new和delete,但是这起到什么作用?首先我们来看看什么叫链表.
链表是一种重要的数据结构,是我们动态分配存储的结构.比如说我们知道在定义数组时,我们需要给它一个大小.
int nArr[10] = {0}正确
int nArr[];错误,因为没有给它一个空间大小.
那么我们一开始不知道数组的大小,我们需要输入才知道输入了多少个元素,如果我们定义了100个元素,结果只输入了10个,那么就浪费了很大的空间.在数组中是无法解决这个问题的,我们可以通过链表来解决这个问题.
链表就是一串连接起来的变量.一个连一个,但是这些变量都可以随即在内存中存放,通过指针来进行连接.(具体细节和链表的详细介绍在我们讲了链表操作的时候再写.)链表的优点就是不会浪费内存.
如何来给这个链表开辟空间?在C语言中就要用到malloc/free和calloc/free函数,在C++中要用到new和delete.
3.new和delete的具体使用:
new和delete是操作符,定义的一般形式为:
int* pInt = new int ;
↑ ↑ ↑ ↑
类型名 指针变量 new 类型.
delete pInt
这样就释放掉了空间.
int* pA = new int的几个步骤
第1步,看类型,int或char,用sizeof查看需要开辟什么样的多少长度的空间。
第2步,将正确类型返回到指针。
第3步,按照编译器的规则为指针开辟内存空间。
这里
int* pA = new int ;
*pA = 5;
这两句和
int* pA = new int(5);
是一个效果.
但是这种情况
int* pA = new int[5];
int nArr[5] = {0};
delete pA;//这样的释放是错误的,虽然不报搓,但是很不规范
delete[] pA;//这样才是全部释放
相关文章推荐
- 8章3节分配删除指针new和delete
- C++文件头,命名空间,new和delete,内联函数,引用,函数重载,构造函数和析构函数,深拷贝和浅拷贝,explict,this指针
- 条款7:当使用new得指针的容器时,记得在销毁容器前delete那些指针
- cppTest-3.0:指针相关-3(new&delete)
- c++ 浅拷贝和深拷贝 指针和引用的区别 malloc(free)和new(delete)的区别 重载重写重定义
- C++的指针的坑:“new[]的指针需要delete[]”和“子类指针可以转父类指针”的两条规则成功的冲突到了一起
- new、delete、指向连续空间的指针、数组、空间释放、空间申请[C++][内存管理]
- 删除(delete)空指针是安全的=>指针初始化为0或有效内存(new)
- C++中指针的new和delete
- 指针和整数,指针和数组,new和delete,cstring和string
- 指针_引用_内存管理new_delete
- C++(4)/new delete & static & this指针 & 全局函数和成员函数
- 一级二级指针new、delete、malloc、free
- new、delete、指向连续空间的指针、数组、空间释放、空间申请[C++][内存管理]
- 空指针、void*指针、new及delete
- C++(1) 指针 new 和delete
- 字符串排序;指针的指针运用;new 与 delete
- new和delete 基类指针指向继承类的对象时,delete的过程
- new、delete 与指针
- 在C++动态库中释放调用动态库程序中生成的指针new和delete 或 malloc和free