mirror of
https://github.com/MaSzyna-EU07/maszyna.git
synced 2026-10-18 03:19:19 +02:00
TDynamicObject::Update() reads ctOwner->Controlling() every frame, but ctOwner is only ever refreshed by CheckVehicles() and cleared only by Dettach(). Both TController::MoveTo() and ~TDynamicObject() delete a controller while the rest of the consist still points at it, so the vehicles keep dereferencing freed memory until some other driver happens to claim them. Seen as a segfault in DynObj.cpp on ctOwner->Controlling()->MainCtrlPosNo after changing cabs through an EN57 with an AI driver in the leading unit: ctOwner was a live-looking pointer into a freed TController, its mvControlling long gone. ~TController() now clears ctOwner on every vehicle still pointing at it. nullptr is what the readers already expect - they fall back on Mechanik or skip the block - and the next CheckVehicles() re-establishes ownership.
390 KiB
390 KiB