2020-05-08
メモリリーク問題
- メモリリーク問題の直接的な原因は、ダングリングポインタを
newした後、deleteしなかったことです。 - 現在位置を更新した後、map kit が
prepareGuidanceDataを呼び出し、現在位置に最も近いガイダンスデータを見つけようとします。 prepareGuidanceDataはNavInfoProviderImpl::getTrafficLightsとNavInfoProviderImpl::getCarParksを呼び出します。NavInfoProviderImpl::getTrafficLightsを例にとると、呼び出し時にNaviEventOnPath内のデータポインタをnewで生成しています。- しかし、
deleteが行われていません。 - また、
DestEventにも同様の問題があることが判明しました。
解決策: 根本的にはダングリングポインタを許さないことであり、NaviEventProvider に対してリファクタリングを行うことにしました。
- まず、
NaviInfoProviderにtraffic_light_eventsとcar_park_eventsという 2 つのフィールドを追加します。 NaviInfoGeneratorで、ルートが更新された後にこれら 2 つのフィールドを更新します。- そして、
getが呼ばれるたびに、現在の車両位置に基づいてフィルタリングを行います。 - そのため、
PathReader::getAttributesをリファクタリングする必要があります。理由は、これまでの実装では現在の車両に対する相対オフセットのみを考慮していたため、パスに対するオフセットインターフェースが必要になるからです。