870920 Menu

JUCE类库的“安全”指针

 ScopedPointer 作用域指针,类模板

作用域指针ScopedPointer用来替代传统的指针,非常实用。当该指针离开声明它的作用域范围,或者指向一个新的堆对象,或者被显式赋值为nullptr时,它所指向的堆对象将自动被销毁并释放内存。永远无需也不要delete本类的对象。

如果不打算继续指向某个堆对象,又不想在获新值后自动销毁之,则调用release()函数。该函数执行的结果是:当前作用域指针变为空指针,并返回先前所指的堆对象的普通指针。示例(假设compA和compB均为Component类的派生类,即内容组件类):

 ReferenceCountedObjectPtr 引用计数指针,类模板

引用计数指针比ScopedPointer更进一步,同样无需显式delete之。不同处:多个引用计数指针可以共享(同时指向)同一个堆对象,这些引用计数指针中的某些离开作用域或指向其它堆对象时,并不会销毁当前的堆对象,只有当最后一个指向该堆对象的引用计数指针不再存在时,堆对象才被自动销毁。

使用引用计数指针有两个前提,一是要创建堆对象的类必须继承自ReferenceCountedObject类,无需实现该基类的任何虚函数(该基类也没有虚函数可实现)。二是创建堆对象时声明指针的语法(与ScopedPointer一致):
ReferenceCountedObjectPtr ptr = new MyClass();

经笔者(Running)亲测,Windows平台下,相比传统指针,ScopedPointer的性能仅下降了0.25%。OSX平台下,0.20%。两个平台下,使用引用计数指针则几乎没有任何性能损失(检测前提是只有一个指向堆对象的引用计数指针)。实际编程中,只要不是极端在意性能,完全可以用ScopedPointer作用域指针和ReferenceCountedObjectPtr引用计数指针取代传统的指针。并且,强烈推荐这么做(这也是现代C++的编程趋势之一)。

此外,使用引用计数的堆对象还可以作为var对象来使用,从而享受到ValueTree类强大的管理功能。

 OptionalScopedPointer 选项作用域指针,类模板

与ScopedPointer基本一致,区别:它所持有的指针离开作用域时可设置是否销毁所指的堆对象。

 Component::SafePointer 针对Component类的安全指针,类模板

Component::SafePointer与ScopedPointer基本一致,区别有二:

➢ SafePointer是Component类的嵌套类模板,使用时需加前缀“Component::”。
➢ SafePointer指针只能指向Component及其派生类,且不能自动销毁它所指的堆对象。

 WeakReference 弱引用指针,类模板

该指针非常适合多线程环境下使用,即:当所指向的堆对象被销毁后,该指针自动变成nullptr。某个类要使用弱引用技术,只需在类的private区中添加如下两行代码(声明弱引用类的嵌套类Master的栈对象,并将弱引用声明为本类的友元类):

WeakReference::Master masterReference;
friend class WeakReference;

声明弱引用指针:
WeakReference weakRefPtr = new MyClass();