嵌入式c++智能指针学习

  • 先看一个实例:
class Demo
{
public:
	explicit Demo() { TRACE(); }
	virtual ~Demo() { TRACE(); }
};

void nofreemem()
{
	TRACE();
	Demo *p = new Demo;
}
int main()
{
	nofreemem();
	nofreemem();
	nofreemem();
	return 0;
}

        对象指针是函数nofreemem内的局部变量,每次new出对象, 但是nofreemem返回时并没有delete, 造成的后果就是对象指针指向的堆区在nofreemem运行完成后并没有释放, 且对象也没有销毁。

        除了上例使用普通指针,容易造成内存泄漏,还容易二次释放,程序发生异常时内存泄露等问题等。正是因为指针存在这样的问题,C++便引入了智能指针来更好的管理堆内存。

        智能指针(smart pointer)是个特殊的类模板, 重载了“ ->” 和“ *” 运算符,当超出了类的作用域时,类会自动调用析构函数,自动释放资源 ,实现了C++的自动内存回收机制。

        在C++11中有四种智能指针, auto_ptr, shared_ptr, unique_ptr和weak_ptr。 其中auto_ptr有和多不足之处, 在C++11中已经建议废弃使用。

  • shared_ptr

        实现原理:有一个引用计数的指针类型变量,专门用于引用计数,使用拷贝构造函数和赋值拷贝构造函数时,引用计数加1,当引用计数为0时,释放资源。shared_ptr( 共享资源的智能指针) 被用来表示共享的拥有权。 也就是说,当两段代码都需要访问一些数据, 而它们又都没有独占该数据的所有权(从某种意义上来说就是该段代码负责销毁该对象) 。 shared_ptr是一种计数指针。 当引用计数变为0时, shared_ptr所指向 的对象就会被删除。 在给
shared_ptr分配内存时建议使用make_shared函数,这样最安全。

class Demo
{
public:
	explicit Demo() { TRACE(); }
	virtual ~Demo() { TRACE(); }
	void func();
};


void safeHeap()
{
#if 1
	shared_ptr<Demo>p = make_shared<Demo>(Demo());
#else
	shared_ptr<Demo>p(new Demo);
#endif
	shared_ptr<Demo> pp(p);
	cout << p << ":" << pp << endl;
	p->func();
}
int main()
{
	safeHeap();
	return 0;
}
  • unique_ptr

        同一时刻只能有一个unique_ptr指向给定对象( 通过禁止拷贝语义、 只有移动语义来实现) 。unique_ptr指针的生命期从创建时开始, 直到离开作用域。 离开作用域时,若其指向对象, 则将其所指对象销毁(默认使用delete操作符, 用户可指定其他操作)。

        unique_ptr的使用能够包括:
                   为动态申请的内存提供异常安全
                    将动态申请内存的所有权传递给某个函数
                    从某个函数返回动态申请内存的所有权
                    在容器中保存指针
                     所有auto_ptr应该已经具有的( 但是无法在C++98中实现的) 功能

class Demo
{
public:
	explicit Demo() { TRACE(); }
	virtual ~Demo() { TRACE(); }
	void func();
};


void safeHeap()
{
	unique_ptr<Demo>p(new Demo);
	p->func();
}
int main()
{
	safeHeap();
	return 0;
}
  • weak_ptr

        weak_ptr可以保存一个“ 弱引用” , 引用一个已经用shared_ptr管理的对象。 为了访问这个对象, 一个weak_ptr可以通过 shared_ptr的构造函数或者是weak_ptr的成员函数lock()转化为一个shared_ptr。 当最后一个指向这个对象的shared_ptr退出其生命周期并且这个对象被释放之后, 将无法从指向这个对象的weak_ptr获得一个shared_ptr指 针, shared_ptr的构造函数会抛出异常, 而weak_ptr::lock也会返回一个空指针。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值