问题描述
- c++ 复制指针释放问题
-
#include
#include
#include
using namespace std;class HasPtr
{
public:
HasPtr(int *p, int i):ptr(p), val(i){}
int *get_ptr() const {return ptr;}
int get_int() const {return val;}
void set_ptr(int *p) {ptr = p;}
void set_int(int v) {val = v;}
int get_ptr_val() const { return *ptr;}
void set_ptr_val(int val) const {*ptr = val;}public:
int *ptr;
int val;
};
int main(int argc, char *argv[])
{
int obj = 0;
HasPtr ptr1(&obj, 42);
HasPtr ptr2(ptr1);
//此时ptr1的val 和 ptr 与ptr2 的地址是一致的
ptr1.set_int(34); //复制一个算术值时,副本独立于原版,可以改变一个副本而不改变另一个
cout << ptr1.get_int() << " " << ptr2.get_int() << endl;
ptr1.set_ptr_val(45); //复制指针时,地址值是可区分的,但指针指向同一基础对象。如果在任一对象上调用 set_ptr_val,则二者的基础对象都会改变
cout << *(ptr1.ptr) << " " << *(ptr2.ptr)<<endl;
//
int *intp = new int(10);
HasPtr ptr3(intp, 20);
delete intp;
intp = NULL;
ptr3.set_ptr_val(22);
cout << *(ptr3.ptr)<<endl;
return 0;
}int *intp = new int(10);
HasPtr ptr3(intp, 20);
delete intp;
intp = NULL;
ptr3.set_ptr_val(22);
cout << *(ptr3.ptr)<<endl;
intp删除了,程序照样执行,不知道为什么,ptr3.ptr 与intp指向同一个位置
解决方案
指针释放,未必这块内存一定被再次分配出去,在此期间,程序运行的行为是不可预料的。所以在释放后,就不要再使用指向它的指针。
解决方案二:
复制指针目的无非就是不同地方使用,都是用一样的资源,有一处释放掉了,其它的也释放掉了
解决方案三:
ptr3.ptr和intp不是同一个内存,他们内容是不一样的。就好像你定义了int a,b;a=10;b=10;a=0;这个时候判断:b!=0
因此intp释放后ptr3.ptr肯定不指向NULL,你填值可能不会崩溃代码,但是还是危险操作。
解决方案四:
指针释放后,表示这一块区域会被回收,但是有可能你再次访问的时候,它还没有被重新使用,所以恰巧可以被访问到
但是这个行为对编译器来说是UB。