C/C++/CPP中与虚拟存储器(指针)有关错误汇总(二)

首先参考  

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++中允许程序员利用指针直接操作内存,为编程带来了极大的方便,同时由于使用指针又有各种各样的问题,所以在实际应用中还是该减少指针的使用。



你可能感兴趣的:(thread,多线程,编程,算法,null,存储)