一个没有引发异常中断的access violation

access violation:

由于对于没有分配的内存进行访问,而导致程序异常中断。

 

代码段如下:

int* lpbuffer = new int[1000];
int* a = new (lpbuffer) int[0];

a[10] = 10;


对于以上的代码段,程序就不会引发异常中断。

为什么没有异常中断: 因为在运行上面的代码时,系统认为已经有1000* 4的内存空间分配在heap上了,而你在已经分配的内存上修改内容是允许的。所以不会触发异常中断。

由于没有异常中断,所以对于程序员来说是很难找到这个错误的地方。

 

但是这个程序段确存在着一个隐藏的一个问题:

如果现在同时有一个指针b在lpbuffer上分配另一个内存区间,那么a[10] = 10;会导致对b内存空间上的内容被修改。

这就引发了很诡异的数据被无故的修改,但是又没有明显的异常中断。

如果b指针和a指针在两个不同的线程里同时操作,那问题就更诡异了,线程a可以通过指针a修改线程b里面b指针的内容。

 

为什么使用new(buffer)这种形式分配内存呢? 目的是为了对内存进行统一管理,到最后只需要delete [] lpbuffer;就可以释放掉所有的内存。

这是使用new(buffer)这种形式的好处,坏处就如上面所述,即使你访问了不该访问的内存,系统也不会给你报错。

 

这是项目code过程中碰到的一个bug,引以为戒。

 

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值