0xC0000005: 写入位置 0x00000000 时发生访问冲突的解决办法(内存对齐)

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

猜你喜欢

转载自blog.csdn.net/weixin_44517656/article/details/108672686