如何使用C++智能指针,及注意事项。

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; // 错误,智能指针的构造函数只接受普通指针作为参数,
// 指针到对象的赋值类型不匹配。

2int 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:多个指针拥有对象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值