指针是个很强大的工具,可是正因为它太强大,所以要操作它不是件易事。操作不当造成的野指针,甚至会引起系统死机等比较严重的后果。
在编程的时候,告诫自己,注意下列几点:
- 避免使用未初始化的指针,声明一个指针的时候一定要将它初始化或者直接赋值为NULL。
int *pInt = NULL;
- 在动态delete释放一个指针所指向的内存后注意将该指针置空,同理,对一个指针应用free之后,它的值不会改变,但它指向了一个无效的内存区,这时称该指针为“悬空指针”。释放完毕以后记得给他null地址。
//对应于int *pInt=new int[num];
delete []pInt;
pInt = NULL;
//对应于int *pInt=new int;
delete pInt;
pInt = NULL;
- 在为一个指针再次分配内存之前一定要保证它原先没有指向其他内存,防止出现Memory leak。解决的办法是我们必须判断该指针是否为空,因为如果释放某内存后相应指针不置空的话就不能为其分配新内存了。
if(pInt==NULL)
pInt=new int[num];
else
delete []pInt;
- 刚刚分配的动态内存的初始值是不确定的,分配完内存以后注意ASSERT判断是否分配成功,分配成功后才能使用。
pInt = new int[num];
ASSERT(pInt != NULL);
- 程序在退出main函数时会释放所有内存空间,但对于大型程序最好还是某块内存不用了立刻释放,而不要指望系统最后的回收,因为内存泄漏会慢慢消耗系统资源直到内存不足而程序死掉。
- 不要再一个函数里面分配local pointer,送到另外一个函数去delete。 在前函数里面指向内存区域的指针已经无效。
指针和引用的联系与区别 :
相同点:
1.都是地址的概念;
指针指向一块内存,它的内容是所指内存的地址;引用是某块内存的别名。
不同点:
1.引用使用时无需解引用(*),指针需要解引用。
2.“sizeof 引用”得到的是所指向的变量(对象)的大小,而“sizeof 指针”得到的是指针本身(所指向的变量或对象的地址)的大小。
3.从内存分配上看:程序为指针变量分配内存区域,而引用不需要分配内存区域。
4.指针是一个实体,而引用仅是个别名。
5.引用只能在定义时被初始化一次,之后不可变;指针可变。数组作为实参传递给函数时自动退化为指针,而指针作为实参只是简单的复制传值给形参。参考下例:
void GetMemory(char *p, int num) {
p = (char *)malloc(sizeof(char) * num); }
void Test(void) {
char *str = NULL;
GetMemory(str, 100); // str 仍然为 NULL
strcpy(str, "hello"); // 运行错误 }
实际上编译器处理为:
void GetMemory(char *p, int num) {
char * _p;
_p = p;
_p = (char *)malloc(sizeof(char) * num);
}