Skip to content

Instantly share code, notes, and snippets.

@happyj2me
Created November 25, 2019 07:02
Show Gist options
  • Save happyj2me/8a36613310196d4f33fb699a17931562 to your computer and use it in GitHub Desktop.
Save happyj2me/8a36613310196d4f33fb699a17931562 to your computer and use it in GitHub Desktop.
1. 某个对象T要用引用计数进行管理,那么必须实现RefCountedInterface定义的方法,包括AddRef以及Release方法,最简单的办法是用
RefCountedObject<T> 对T进行包装,包装后的类其实是T的一个子类,它具备了AddRef以及Release方法
2. scoped_refptr<T> 实现了引用计数管理的功能,其中的T是步骤1包裹后的子类,get()方法可以获取到指向T的指针,release()方法
也可以获取到指向T的指针,不过获取后同时释放了针对T的引用计数管理功能,所以如果某个scoped_refptr<T>调用了release(),T
本身的引用计数并没有改变,只是传递给了调用方去进行管理
3. 步骤1中的T就好比一个气球,步骤2的scoped_refptr<T>就好比栓在这个气球上的一根线,一旦这个气球没有线拴住了,那么它就会被自动释放掉
4. 举例
peerconnection_client退出的时候,老是core掉,有两个原因:
1. videotrack的创建与销毁涉及到摄像头的启停,摄像头的启停要求在同一个线程里面完成,所以如果线程A创建了videotrack,线程B销毁videotrack,那么会core在同一线程检测逻辑上
2. 添加本地videotrack的时候,操作的是一个scoped_refptr<webrtc::VideoTrackInterface> track,它需要传递到两个地方,一个是peerconnection对象里面,一个是UI渲染模块
其中peerconnection对象里面是通过引用计数传递过去的,而UI渲染接口定义的是裸指针,所以需要调用track.release(), 把引用计数的管理权交给UI渲染模块。如果不调用track.release()
peerconnection退出以后,videotrack就是空指针了,UI模块会core掉。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment