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



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值