VS2015调试时遇到this ->是0xFFFFFFFF(或者其它0xxxxxxxxx)(delete造成的)
顺带总结相关的内存问题:
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没有初始化的例子;第二点就是数字越界的例子,以后遇到这内存问题往这四点或者说是三点思考就行了,细心点肯定能找出。
情况1:
在异步回调的两个处理函数发生的。即在一个异步函数a()中new了一个对象,在另一个异步函数b()delete掉。
new与delete的代码:
class A {
public:
A() {
std::cout << "new" << std::endl;
}
~A(){
std::cout << "delete" << std::endl;
}
};
A *a=NULL;//全局变量
a(){
A *a = new A;
}
b(){
delete[] a;
}
执行现象:
解决
将上面的delete代码换成即可。
delete a;
情况2:有成员对象的情况下。
class A {
public:
A() {
this->e = new char[10];
std::cout << "new" << std::endl;
}
~A(){
if (this->e!= NULL) {
delete this->e;
this->e = NULL;
std::cout << "delete" << std::endl;
}
}
private:
char *e;
};
A *a=NULL;//全局变量
a(){
A *a = new A;
}
b(){
delete[] a;//error
}
执行现象:
解决:同样将[]去掉即可。
重点解释:
我一开始以为是异步的原因,在哪里new必须在哪里delete。结果我测试后,发现不是异步的原因。于是进一步测试,发现原来是delete时不能使用delete[];否则会被一直调用,导致非法访问。