delete释放的指针,再访问
例1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
#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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
#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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
|
#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 帮助理解
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
|
#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.
*/
|
总结
本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注服务器之家的更多内容!
原文链接:https://blog.csdn.net/qq_44888950/article/details/120442843