首先参考
C/C++/CPP中与虚拟存储器(指针)有关错误汇总(一)
6. 错误指针地址运算
指针的算法运算是以他们指向对象的大小为单位来进行运算的,例如整形指针pval, 如果求当前指针指针整数的下一个整数只需要int * pnext = pval + 1,很多对指针不熟悉的人可能会int *pNext = pVal + sizeof(int),从而造成错误。
7. 引用不存在的变量
这个错误的原因是对栈不熟悉
int * Get()
{
int val;
return &val
}
//如下操作是错误的
int * pVal = Get();
*pVal = 1
最后一个赋值语句是错误,因为当Get函数退出时val的内存已经被释放掉,因此此时pVal指向的内存是不存在的(错误的)。
8. 引用已经被free了的指针
int * pval = (int *)malloc(sizeof(int));
*pval = 100;
free (pval);
int val = *pval; //ops!
在最后一句引用错误的,pval指向的内存已经释放,或者可能被其它进程占用。
9. 内存泄漏
在大型项目中,这是一个非常严重的bug,并且在测试时也非常不容易被发现,直到有一天你计算机的内存被全部耗完,你都会意识到问题的严重性。因此在实际编程中一定要注意防止内存泄漏,C/C++中没有垃圾回收机制,所有动态分配的内存都需要程序员自己释放。
void testLeak(int n)
{
int * pval = new int[n];
return ;
}
此时当调用该函数时一就会发生内存泄漏,当函数返回之后,pval指向的内存再也无法被利用,直到程序退出。
10. 多线程种指针问题
int * pval ;
void thread_func(void)
{
(*pval) ++;
}
int main()
{
pval = (int *)malloc(sizeof(int));
pthread_create(&tid, thread_func, NULL, NULL, ...);
free(pval);
return 0;
}
当程序执行时有可能在线程执行(*pval) ++ 之前,主线程执行了free(pval),从而造成错误。一个简单的方法是在free之前进行线程同步。复杂一点可以使用智能指针来防止这种意外。
综述:
C/C++中允许程序员利用指针直接操作内存,为编程带来了极大的方便,同时由于使用指针又有各种各样的问题,所以在实际应用中还是该减少指针的使用。