weak_ptr的一点认识

简介: 近期在补充和梳理C++方面的知识的时候,遇到了WeakPtr这个概念和用法,不甚明白,Google出了一堆文字,包括Boost的shared_ptr和weak_ptr的比较,以及其他一些博客里面给的例子以及解释。
+关注继续查看

近期在补充和梳理C++方面的知识的时候,遇到了WeakPtr这个概念和用法,不甚明白,Google出了一堆文字,包括Boost的shared_ptr和weak_ptr的比较,以及其他一些博客里面给的例子以及解释。

其中有一个是这样解释的,原文大意:在C++的weak_ptr里面,有两类指针,一类是拥有对象的生命周期;另一类不拥有,只有访问权。

 

在这里,我就有点不明白,这两类指针,到底会在编写上面,或者形式上面,有什么区别呢?

或者说weak_ptr到底要解决编程当中的什么问题呢? 为什么会有这个类型被提出?

 

经过和一位朋友的讨论,有了答案。

 

比如现在有两个函数

class A;

void Func1(A* a);

void Func2(A* a);

 

A* a = new A;

 

Func1(a);

Func2(a);

 

他们在同一个作用域的时候,a 被释放后,惯有的操作是 a = NULL这个时候Func2 或者 Func1中都可以判断到这个变化。

 

但是如果Func1在另外一个线程/进程里面,你在传递过来的时候a并不是空的a,但是指向的对象,已经被释放了,这个指针已经不在有权限去访问了。那么就会出现问题。

 

所以weak_ptr就出现了,让你在使用资源之前,先去问下HasWeakPtr() 如果有,那么表明这个资源还没有被释放,可以放心去用,否则就应该不能再使用了。

 

以往的代码,写法: if (a) {} 

但是*a 已经被释放之后,其实a并没有在上下文被a  = NULL 所以a 还是指向那个地址,但是地址指向的内容已经非法了。

 

一点点小认识,希望对于大家对weak_ptr的理解有所帮助。

目录
相关文章
|
1月前
|
存储 缓存 iOS开发
(转)谈weak对象、对象缓存以及Tagged Pointer
(转)谈weak对象、对象缓存以及Tagged Pointer
14 0
shared_ptr能和基于引用计数的智能指针混用吗?
shared_ptr能和基于引用计数的智能指针混用吗?
|
2月前
|
安全 程序员 C++
探究C++11智能指针之std::unique_ptr
谈起C++,它被公认为最难学的编程语言之一,不仅语法知识点广泛,细节内容之多,学习难度和学习周期也长,导致好多新入行的开发者对C++“敬而远之”,甚至“从入门到放弃”。自C++11开始,好多C++程序员慢慢的感受到了C++的魅力所在,似乎难度也越来越小。
|
4月前
|
安全 C++
智能指针 smart_ptr
智能指针 smart_ptr
37 0
|
5月前
|
编译器 C++
shared_ptr 和 unique_ptr 深入探秘
shared_ptr 和 unique_ptr 深入探秘
67 0
|
5月前
|
程序员 C++
C++11之智能指针(unique_ptr、shared_ptr、weak_ptr、auto_ptr)浅谈内存管理
C++11之智能指针(unique_ptr、shared_ptr、weak_ptr、auto_ptr)浅谈内存管理
61 0
|
5月前
|
运维 编译器 C语言
__weak类型函数
__weak类型函数
50 0
|
7月前
|
安全 Linux 开发工具
C++11 智能指针之shared_ptr<void>
基于Alexa的全链路智能语音SDK基于C++实现了跨平台特性,跑通了Android、Mac、Linux等设备,在兼容iOS时发现iOS未提供音频采集和播放的C++接口,所以需要改造SDK,允许SDK初始化时注入外部的采集器和播放器实现类,同时SDK中的Android播放器是基于ffmpeg解码 + opensl实现,但是考虑到包体积的问题,准备也基于这个接口在外部实现基于Android硬件解码的播放器。
176 0
|
安全 前端开发 网络安全
【Example】C++ 标准库智能指针 unique_ptr 与 shared_ptr
在现代 C + + 编程中,标准库包含智能指针,智能指针可处理对其拥有的内存的分配和删除,这些指针用于帮助确保程序不会出现内存和资源泄漏,并具有异常安全。C 样式编程的一个主要 bug 类型是内存泄漏。 泄漏通常是由于为分配的内存的调用失败引起的 delete new。 现代 C++ 强调“资源获取即初始化”(RAII) 原则。 其理念很简单。 资源(堆内存、文件句柄、套接字等)应由对象“拥有”。 该对象在其构造函数中创建或接收新分配的资源,并在其析构函数中将此资源删除。 RAII 原则可确保当所属对象超出范围时,所有资源都能正确返回到操作系统。 --Microsoft Docs
164 0
相关产品
云迁移中心
推荐文章
更多