内存泄漏:

 

 当指针p和变量y被释放掉,new所开辟的内存不会被释放,这就是内存泄漏。

 

shared_ptr:

 ***注意***use_count是share_ptr的方法,用来记录有多少个指针指向该内存,reset关键字表示重置使指针不再指向原来的对象(而该指针自动指向nullptr)对象被释放(所有指针被重置,也就是没有指针指向该对象了)而指针依然存在。

**注意**当函数退出时,智能指针会被释放,它所指向的内存同样也被释放,而裸指针却不会。

 share_ptr声明指针,make_shared申请一块内存,当指向该内存的所有指针被释放时,这块内存也被释放。

下面是指针及内存的使用方法,推荐第二个

如果想自定义释放规则可以这样用,当使用reset时sfp指针才会被重置

(**注意**这里是fp作为实参传给了close_flie函数)

 1 void close_file(FILE* fp)
 2 {
 3     if (fp == nullptr) return;
 4     fclose(fp);
 5     cout << "File closed" << endl;
 6 }
 7 int main()
 8 {
 9 
10     FILE* fp = fopen("C:\\Users\\WENCHAO\\Desktop\\data.txt", "w");
11     shared_ptr<FILE> sfp{ fp,close_file };
12     sfp.reset();
13     if (sfp == nullptr)
14     {
15         cout << "Error" << endl;
16     }
17     else cout << "Open" << endl;
18     system("pause");
19     return 0;
20 }

 

 

裸指针(普通指针)指向make_shared申请的内存使用“get()”方法

 

 reset还可以这样用

 

 当对象A里面嵌套着对象B,即便指向B的指针被重置,B对象也不会被释放

 1 class Inside
 2 {
 3 public:
 4     Inside() {
 5         cout << "Inside appear" << endl;
 6     }
 7     ~Inside() {
 8         cout << "Inside disappear" << endl;
 9     }
10     int var1 = 0;
11 };
12 class Test
13 {
14 public:
15     Test() {
16         cout << "Test appear" << endl;
17     }
18     ~Test() {
19         cout << "Test disappear" << endl;
20     }
21     Inside in;
22     int var2 = 0;
23     int var3 = 0;
24 };
25 int main()
26 {
27     shared_ptr<Test> point;
28     point = make_shared<Test>();
29 
30     shared_ptr<Inside> po(point, &(point->in));
31     po.reset();
32     shared_ptr<Inside> po1(point, &(point->in));
33     system("pause");
34     return 0;
35 }

 

 指向对象A的指针不能指向对象B,指向对象B的指针不能指向对象A

 

posted on 2022-11-22 14:21  小凉拖  阅读(309)  评论(0编辑  收藏  举报