2020-05-08

メモリリーク問題

  • メモリリーク問題の直接的な原因は、ダングリングポインタを new した後、delete しなかったことです。
  • 現在位置を更新した後、map kit が prepareGuidanceData を呼び出し、現在位置に最も近いガイダンスデータを見つけようとします。
  • prepareGuidanceDataNavInfoProviderImpl::getTrafficLightsNavInfoProviderImpl::getCarParks を呼び出します。
  • NavInfoProviderImpl::getTrafficLights を例にとると、呼び出し時に NaviEventOnPath 内のデータポインタを new で生成しています。
  • しかし、delete が行われていません。
  • また、DestEvent にも同様の問題があることが判明しました。

解決策: 根本的にはダングリングポインタを許さないことであり、NaviEventProvider に対してリファクタリングを行うことにしました。

  • まず、NaviInfoProvidertraffic_light_eventscar_park_events という 2 つのフィールドを追加します。
  • NaviInfoGenerator で、ルートが更新された後にこれら 2 つのフィールドを更新します。
  • そして、get が呼ばれるたびに、現在の車両位置に基づいてフィルタリングを行います。
  • そのため、PathReader::getAttributes をリファクタリングする必要があります。理由は、これまでの実装では現在の車両に対する相対オフセットのみを考慮していたため、パスに対するオフセットインターフェースが必要になるからです。