为什么delete报错了?
为什么delete报错了?
今天delete的时候报错了,很奇怪,怎么前面new的指针后面delete就报错了呢?后来看了半天,代码是这么写的:
char* p = new char[100];
CBigInt* D = (CBigInt*)P;
delete [] p;
...
之后有对D进行操作,是因为将P转换为CBigInt*类型,delete后,系统会对p所指的内存回收,然后后面又操作D的原因吗?
编译没有问题,就是运行的时候,程序关闭了。。。不设断点,直接调试运行又没事,这是为什么呢?
[解决办法]
你对CBigInt这个指针赋值时,应该是浅拷贝,这个指针和你new出来的是同一块空间,delete再使用指针指向的对象肯定是未定义行为。建议楼主单步调试看看两个指针所指向的地址的内容。
[解决办法]
delete是不会有问题的
因为delete是对free的优化
相当于
if(p!=NULL)
free();
delete出现问题肯定是由于你delete之后还访问了这片内存,而这片内存可能是不可访问的或者你在这片内存区域又写入了内存导致程序出错。
其实就是野指针惹得祸,程序可能设计得不是很理想吧。
[解决办法]
CBigInt* D 和P是指向同一块内存,你delete[]p以后,D就成为悬垂指针了,指向的对象其实已经不存在了,再进行操作必然出问题啊
[解决办法]
char* p = new char[100];
CBigInt* D = (CBigInt*)P;
delete [] p;
这里面只有一个new,虽然有两个指针,但是这两个指针指向同一个内存空间的。说下深复制与浅复制吧:
复制就是普通的简单的常见的赋值运算符的使用。但是这里面会出现一个问题,如果你的自定义类中有一个指针变量怎么办?由此提出了深复制。就是将指针所关联的资源一并复制一份出来。再来看你的这段代码,你把p所指向的空间delete后,这段空间就会被编译器回收了,但是你的另一个变量D却还指向这段内存啊,这是很危险的,也是很隐蔽的错误。建议使用智能指针,或是深度复制,再或者是在delete之前先做是否为空判断,还有指针的使用最好在使用前加上一个断言。
为啥delete报错了
为什么delete报错了?为什么delete报错了?今天delete的时候报错了,很奇怪,怎么前面new的指针后面delete就报
