1、基础介绍
a、智能指针是行为像指针的类对象,其包含一些功能有助于处理动态内存。
b、使用智能指针需包含<memory>
头文件。
c、四个智能指针分别为:
- auto_ptr:C++11抛弃,用unique_ptr代替。
- unique_ptr:C++11新增,建立所有权,只能一个指针拥有指定对象,赋值操作会转移对象所有权。
- shared_ptr:C++11新增,建立引用计数,可以多个指针拥有一个对象,计数器归零时才调用delete。
- weak_ptr:C++11新增,没了解。
2、如何定义智能指针对象
只能用于堆上内存
#include<memory>
#include <string>
1、
auto_ptr<double> a1 = new double(5.2);
double* a2 = new double;
a1 = a2; // 错误,智能指针的构造函数只接受普通指针作为参数,
// 指针到对象的赋值类型不匹配。
2、
int b1 = 123;
unique_ptr<int> b2(&b1); // 错误,只能用于堆上内存
std::string abc = "asjdhasj";
unique_ptr<std::string> b3(&abc); //错误,b3过期时,
// delete用于非堆上内存,引发错误。
3、
unique_ptr<std::string> c = new std::string("abcde");
shared_ptr<int> c (new int);
3、智能指针赋值的注意事项
1、
string *ptr1 = new string("abcde");
string *ptr2 = new string;
delete ptr1; delete ptr2;
ptr2 = ptr1; // 语句正确,运行离开作用域时报错。
// 离开作用域,两个动态内存指针释放相同空间两次,发生错误。
2、
auto_ptr<string> ptr1 (new string ("abc"));
auto_ptr<string> ptr2;
ptr2 =ptr1; // 与(1)同样问题。运行时错误,解决方法:用shared_ptr代替。
若用unique_ptr代替:
unique_ptr<string> ptr1 (new string ("abc"));
unique_ptr<string> ptr2;
ptr2 =ptr1; // 不允许,编译时出错因此比auto_ptr好,C11丢弃了auto_ptr。
// 但=右边为一个临时右值(如函数返回值)则可以。
// 临时右值:调用完就消失,不长期存在。
3、
std::unique_ptr<double[]> ptr(new double(5));
只有unique_ptr可以用于new[]分配内存。
4、
unique_ptr<string> ptr1 (new string ("abc"));
unique_ptr<string> ptr2;
ptr2 =std::move(ptr1); // 标准库函数move提供实现。
ptr1 = new string ("ddd"));
shared_ptr拥有一个显示构造函数,可将右值unique_ptr转换为shared_ptr。
总结
1、智能指针只能用于堆上内存,需要将指向堆内存的指针作为参数传给构造函数。
2、使用unique_ptr代替auto_ptr,其不允许左值赋值操作,在编译时报错。
3、unique_ptr:一个指针拥有对象,shared_ptr:多个指针拥有对象。
来源:CSDN
作者:夜空紫色
链接:https://blog.csdn.net/qq_33726635/article/details/104733714