0xC0000005: 写入位置 0x00000000 时发生访问冲突的解决办法(内存对齐)
顺带总结相关的内存问题:
1)写入位置发生冲突(内存对齐造成)
2)delete造成的this->0xFFFFFFFF内存问题链接
其它的话,由于当时项目测试忘了截图只能口述遇到的内存冲突问题了。
3)memcpy_s的问题。
//1)p1没有开辟内存直接memcpy_s或者memcpy_s拷贝后再new
char* p1=NULL;
memcpy_s(p1,size1,p2,size2);
p1 = new char[100000];
//2)p1,p2都有内存,但是在p1的size1大小小于p2的。或者在循环new和delete的时候,不经意把size1和size2改变导致的越界
memcpy_s(p1,size1,p2,size2);
4)3的第一点其实就是指针p1没有初始化的例子;第二点就是数字越界的例子,以后遇到这内存问题往这四点或者说是三点思考就行了,细心点肯定能找出。
前言:
小白内存字节对齐问题可看我的这篇文章,基本解决99.9%的面试题,让你更好了解内存对齐。
01偏移量知识
02内存对齐
第一篇可以不用看,当然有时间最好看,加强你的知识水平。
以下是网上说的情况。这是最基本的出错情况。大家可以根据自己的情况和他的对照着看看:
1):
char *p;
p = new char[2];
delete [] p;
// always using p....
p = xxx; // error
2):
char *p;
memcpy(p, xxx, number); // error
3):
char *p;
p = new char[number];
delete [] p;
.........
delete [] p; // error
C++环境下,不过大部分情况思路差不多:
而我要说的是,我与他们不一样,我是间接导致的。我在封装C++类的时候,成员数据已经初始化赋值的情况下,代码跑着跑着就出现这种情况。看图:
结果一顿操作,弄了快一天,不断打印信息,结果发现,我已经初始化的情况下,代码跑着跑着,打印出的成员数据是一个很大的负数,这时就想到肯定是数据取错,访问到为定义的内存,或者你可以理解为数组越界。造成这种情况我立马相对字节对齐问题,立马将字节对齐改为1,马上没问题!
#pragma pack(1)
当然,我在跑代码的时候也报了以下错误,有些人说是项目属性问题,有些人说是不同模块的new与delete问题,我这里是内存对齐问题,解决后就没有报过了,这里也说以下,减少大家遇到这种问题的苦恼啊!!!
Invalid address specified to RtlValidateHeap