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