c++中的状态机模式

状态机模式,是在构造高层系统时比较常用的一种设计模式。它的基本思想是,将同一系统的不同状态对象化,不同状态的对象分别处理系统在不同状态下业务问题。以最常用的播放机为例来说,就是将Play,Stop,Pause这些不同的状态,声明为class Play,class Stop,class Pause等,然后分别在类内部去处理不同状态下对按键事件的反馈和状态间的切换等。

有关状态模式的一个基本实现,网上有较多例子,我就不赘述了,可以参考以下两篇文件:

Java设计模式中的状态机:https://www.cnblogs.com/of-fanruice/p/11565679.html
C++设计模式中的状态机:https://blog.csdn.net/fanyun_01/article/details/51791086

我在这里要说的,是在这些实例中忽视的一个重要问题:状态的资源释放。

网上几乎所有的状态机C++实现,都没有考虑废弃状态的资源释放问题。当一新状态产生,直接替换了旧状态,而未对旧状态进行处理。这样的方式,在Java中是没有问题的,因为Java会在对象没有调用者时,由虚拟机垃圾回收机制,自动地处理掉废弃状态对象。但C++显然没有这样的机制,会造成内存泄漏。所以,对于在C++中使用状态机模式时,要特别注意处理资源的释放问题。

可以有两种解决方法:一、自己建立局部性的垃圾回收机制,用于自动释放状态对象;二、利用shared_ptr进行保活和自动释放。

比较推荐的方法是后者,相对较简单。当对象切换被调用时,只要是通过share_ptr调用,就可以进行保活,不会导致对象马上被释放点,从而避免调用已被释放的资源。

原文地址:https://www.cnblogs.com/qyit/p/14874866.html