Created
November 25, 2019 07:02
-
-
Save happyj2me/8a36613310196d4f33fb699a17931562 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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