至于标题,我有一个com事件,有些类调用了Advise
。是否有必要在生成事件的com对象被销毁之前调用Unadvise
函数?
答案 0 :(得分:3)
是的,这是必要的。在取消它之前,连接点会保存接收器接口指针并阻止其释放。它不会在收到Unadvise
请求之前释放它。不做Unadvise你将永远活着,导致像条件一样的内存泄漏,并且接收器将继续接收可能导致其他问题的事件。
如果您正在释放事件源并且这会导致源破坏,那么是的,它可能会释放所有宿指针。但是,如果其他人也持有对此对象的引用,则不会发生这种情况。所以很容易得到循环引用,当它们开始创建泄漏时很难将它们钉死。
在连接点的情况下,循环引用是典型的。您可以保留点的接口以用于非特定目的,并且连接点可以保留您的接收器接口。 Unadvise是您通常如何在COM对象之间正常终止此引用。
答案 1 :(得分:1)
根据规范,这并非严格必要,但这是一个好主意。
如果不这样做,应该发生的是当对象消失时,连接点应该释放你的事件接收器接口。但是,如果连接点执行得很糟糕,他们可能会忘记这样做,那么你的宿对象永远不会被破坏。
如果你致电Unadvise
,那么其他人的错误就会少一点。
你犯的错误也少一点:如果其他人持有对象引用,那么当你释放它时它不会消失,所以你将继续得到事件,你可能不会期待发生,所以可能会导致进一步的错误。