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,引以为戒。