VS2015调试时遇到this ->是0xFFFFFFFF(或者其它0xxxxxxxxx)(delete造成的)

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[];否则会被一直调用,导致非法访问。

猜你喜欢

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