内存泄漏:
当指针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