前面讲的技术都只是处理简单的情况:出了某一个作用域,对象就被释放;另一个对象被释放的时候,他管理的对象都被释放。实际的程序里经常会有更复杂的情况出现,对象之间互相引用,形成一张网。一个对象会被好几个其他对象用到,你又不能规定出简单的规则,怎么办呢?
常用的一个办法就是引用计数,你可以自己写一点代码来实现,并不难。COM用的就是这个办法。
Boost有这方面的支持,shared_ptr非常好用,随便什么对象都可以;intrusive_ptr也不麻烦。
引用计数的问题在环:最简单的父窗口有子窗口的指针,子窗口也有一个父窗口的指针,所以他们两个的引用计数至少是一,总也到不了零,也就释放不掉。解决的办法是weak_ptr之类的,至少一个方向上不增加计数。
再有引用太多了,计数器溢出也会造成问题。
其实C也有像Java或者C#那样的自动内存管理机制,比如 这一个。对有些应用可能有点慢,至少可以用来在调试版本里检查内存泄漏。
常用的一个办法就是引用计数,你可以自己写一点代码来实现,并不难。COM用的就是这个办法。
Boost有这方面的支持,shared_ptr非常好用,随便什么对象都可以;intrusive_ptr也不麻烦。
引用计数的问题在环:最简单的父窗口有子窗口的指针,子窗口也有一个父窗口的指针,所以他们两个的引用计数至少是一,总也到不了零,也就释放不掉。解决的办法是weak_ptr之类的,至少一个方向上不增加计数。
再有引用太多了,计数器溢出也会造成问题。
其实C也有像Java或者C#那样的自动内存管理机制,比如 这一个。对有些应用可能有点慢,至少可以用来在调试版本里检查内存泄漏。