C++ 指针
简单记录下平时的学习中涉及到指针的注意点,其中有转别人的内容,自己再慢慢添加总结。
转:http://blog.pfan.cn/colormoon/19260.html
1.指针是保存内存地址的变量。
int *pAge=0;
值为零的指针被称为空指针。所有指针在定义时都应该被初始化。没有初始化的指针称为失控指针。
int age=50;
pAge=&age;
以上是为指针赋值的完整过程。
2.对于变量,类型会告诉编译器需要多少存储器去装载。但对于指针,类型并不这样做,所有指针均是4个字节。
3.使用间接引用运算符(*)来引用指针。当一个指针被间接引用时,就读取其所保存的地址处的值。
4.指针有以下三种用途:
i.处理自由存储区的数据;
ii.访问类的成员数据和函数;
iii.通过引用的方式向函数传递变量。
5.局部变量和函数形参位于栈中,寄存器则用于内存管理(如保存栈顶指针和指令指针),代码区位于代码区,全局变量区,其余的内存空间作为自由存储区,称为堆。
栈在函数返回时会自动清除。自由存储区在程序结束之前不会自动清除,所以在占用之后必须主动释放。
6.C++中使用关键字new来分配自由存储区中的内存。new的返回值是内存的地址,它必须被赋给一个指针。如:
unsigned short *pPointer=new unsigned short;
当不在使用一块内存时,使用关键字delete,它的作用是释放内存。
7.内存泄漏。
指针本身是一个局部变量,当声明指针的函数返回时,指针的作用域也就结束了,因此被丢弃了。然而由new申请的内存不会自动释放,于是这块内存就不能被其他数据使用,这种情况就称为“内存泄漏”。因此要记得使用delete来释放内存。释放后最好将指针赋值为0,变为空指针。
另一种造成内存泄漏的情况是:在没有删除一个指针之前就对其重新赋值。如:
unsigned short int *pPointer=new unsigned short int;
*pPointer=72;
pPointer=new unsigned short int;
pPonter=84;
这时保存72的内存空间变得不可用,也没办法再去释放它。应该是再次使用时,先释放。
8.也可以在自由存储区内为类的对象分配内存。如:
Cat *pCat=new Cat;
这条语句调用了默认构造函数(无参数的构造函数)。删除这类指针时,在内存释放之前会调用对象的析构函数。
也就是说,内存分配是在类对象的构造函数中进行的,而内存删除则是在类对象的析构函数中进行的。
9.每个类的成员都有一个隐藏的指针:this指针。该指针指向每一个单独的对象,它保存了对象的地址。
10.迷途指针(或称失控指针、悬浮指针):指对一个指针调用delete时(这样会释放它的内存)却并没有把它设置为空时产生的。若此时并没有重新赋值就试图再次调用它时,就会引起不可预料的结果。
好的解决办法是在删除一个指针后,把它设置为空指针(0)。
11.在指针的类型之前和之后可以使用关键字const,也可以在这两个位置上同时使用。
const int *pOne;
int * const pTwo;
const int * const pThree;
pOne是一个指向整型常量的指针,该指针指向的值是不能被改变的。
pTwo也是一个指向整型的常指针,它指向的整数可以改变,但这个指针不能指向其他变量。
pThree是一个指向整型常量的指针,它指向的值不能被改变,也不能指向其他变量。
保持正确的窍门是观察关键字的右边是什么,如果是类型,那么值就是常量,如果是变量名,那么指针变量本身就是常量。
12.一个指针可以与另一个指针相减。
13.对内存操作的考查主要集中在:
(1)指针的理解;
(2)变量的生存期及作用范围;
(3)良好的动态内存申请和释放习惯。
14 0xC0000005: Access Violation
内存访问错误。应该是访问了不该访问的地方,可能是使用“野指针”访问造成的。比如访问一个已经释放了堆空间,或者退出函数后使用指向堆栈空间中变量的指针,声明了一个指针变量,然后没有new就进行使用。这种致命的问题一定要仔细解决彻底,不留后患。