delete释放的指针,再访问
例1
#include <iostream>
using namespace std;
class Box
{
public:
Box(int,int);
~Box();
void volume();
static int height;
int width;
int length;
};
Box::Box(int wi, int le)
{
width = wi;
length = le;
}
Box::~Box(){cout<<"the pointer is released."<<endl;}
void Box::volume()
{
cout<<height*width*length<<endl;
}
int Box::height = 100;
int main()
{
Box* p = new Box(10,20);
delete p;
cout<<p->height<<endl;
cout<<Box::height<<endl;
cout<<"width" <<p->width<<endl;
cout<<"length "<<p->length<<endl;
p->volume();
return 0;
}
//输出:
/*100
100
width 16257288
length 16253120
-1812113408*/
例2
#include <iostream>
using namespace std;
int * func(){
int * a = new int(10);
return a;
}
int main(){
int * p = func();
cout << *p << endl;//10
//delete关键字用来释放堆区数据
delete p;
// p = new int(5);
cout << *p << endl;//10
return 0;
}
//输出
// 10
// 16584968
解释:
访问 delete 之后的内存是一个未定义行为。 未定义行为可能产生任何结果,包括但不限于:产生期望的结果,产生未期望的结果,产生随机的结果,产生无法解释的结果,运行错误,随机的运行时错误,编译错误,等等 ---- 你只是放弃了对这片内存的所有权。获得所有权的人对这片内存做什么(或者说什么都不做)都不关你的事
static 变量的储存区域
https://blog.csdn.net/qq_32900237/article/details/107094377?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_title~default-0.no_search_link&spm=1001.2101.3001.4242
参考文章
例1
#include <iostream>
using namespace std;
class Box
{
public:
Box(int,int);
~Box();
void volume();
static int height;
int width;
int length;
};
Box::Box(int wi, int le)
{
width = wi;
length = le;
}
Box::~Box(){cout<<"width: "<< width <<"the pointer is released."<<endl;}
void Box::volume()
{
cout<<height*width*length<<endl;
}
int Box::height = 100;
int main()
{
Box* p = new Box(10,20);
cout<<"point "<<p<<endl; //point 0xe91470
cout<<&(p->height)<<endl; //0x405004
cout<<&(p->width)<<endl; //0xe91470
cout<<&(p->length)<<endl; //0xe91474
cout<<sizeof(p)<<endl; //4
cout<<sizeof(*p)<<endl; //8
cout<<sizeof(Box)<<endl; //8
//delete p; //width: 10the pointer is released. 用new创建的对象,必须自己用delete回收,不然系统不会帮助回收,出现内存泄漏
Box a = Box(1,2);
Box *pa = &a;
cout<<"point "<<pa<<endl; //point 0x61ff00
cout<<&(pa->height)<<endl; //0x405004
cout<<&(pa->width)<<endl; //0x61fefc
cout<<&(pa->length)<<endl; //0x61ff00
cout<<sizeof(pa)<<endl; //4
cout<<sizeof(*pa)<<endl; //8
cout<<sizeof(a)<<endl; //8
Box b = Box(3,4);
Box *pb = &b;
cout<<"point "<<pb<<endl; //point 0x61fef4
cout<<&(pb->height)<<endl; //0x61fef4
cout<<&(pb->width)<<endl; //0x61fef4
cout<<&(pb->length)<<endl; //0x61fef8
cout<<sizeof(pb)<<endl;
cout<<sizeof(*pb)<<endl;
return 0;
}
/*
point 0xe91470 新对象的地址
0x405004 静态变量和普通变量地址不连续,是静态变量存在数据段
0xe91470 普通变量存在 开辟的堆上
0xe91474
4 指针大小
8 对象所占内存大小
8 类大小
point 0x61fefc 新对象a的地址
0x405004 静态变量地址不变,静态变量属于整个类
0x61fefc 属于局部变量,普通变量存在 栈空间上
0x61ff00
4
8
8
point 0x61fef4 新对象b的地址, b与a之间相差8个字节
0x405004 静态变量地址不变,静态变量属于整个类
0x61fef4 属于局部变量,普通变量存在 栈空间上,地址连续
0x61fef8
4
8
width: 3the pointer is released. 自动调用析构函数
width: 1the pointer is released. 自动调用析构函数
*/
例2 帮助理解
#include <iostream>
using namespace std;
class Box
{
public:
Box(int,int);
~Box();
void volume();
static int height;
int width;
int length;
};
Box::Box(int wi, int le)
{
width = wi;
length = le;
}
Box::~Box(){cout<<"width: "<< width <<"the pointer is released."<<endl;}
void Box::volume()
{
cout<<height*width*length<<endl;
}
int Box::height = 100;
int main()
{
Box* p = new Box(10,20);
cout<<"point "<<p<<endl;
cout<<&(p->height)<<endl;
cout<<&(p->width)<<endl;
cout<<&(p->length)<<endl;
cout<<sizeof(p)<<endl;
cout<<sizeof(*p)<<endl;
cout<<sizeof(Box)<<endl;
// delete p;
Box* p1 = new Box(30,40);
cout<<"point "<<p1<<endl;
cout<<&(p1->height)<<endl;
cout<<&(p1->width)<<endl;
cout<<&(p1->length)<<endl;
cout<<sizeof(p1)<<endl;
cout<<sizeof(*p1)<<endl;
cout<<sizeof(Box)<<endl;
delete p;
delete p1;
Box a = Box(1,2);
Box *pa = &a;
cout<<"point "<<pa<<endl;
cout<<&(pa->height)<<endl;
cout<<&(pa->width)<<endl;
cout<<&(pa->length)<<endl;
cout<<sizeof(pa)<<endl;
cout<<sizeof(*pa)<<endl;
cout<<sizeof(a)<<endl;
Box b = Box(3,4);
Box *pb = &b;
cout<<"point "<<pb<<endl;
cout<<&(pb->height)<<endl;
cout<<&(pb->width)<<endl;
cout<<&(pb->length)<<endl;
cout<<sizeof(pb)<<endl;
cout<<sizeof(*pb)<<endl;
return 0;
}
/*
point 0x791470
0x405004
0x791470
0x791474
4
8
8
point 0x791108
0x405004
0x791108
0x79110c
4
8
8
width: 10the pointer is released.
width: 30the pointer is released.
point 0x61fef8
0x405004
0x61fef8
0x61fefc
4
8
8
point 0x61fef0
0x405004
0x61fef0
0x61fef4
4
8
width: 3the pointer is released.
width: 1the pointer is released.
*/