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