From 84944a7530ed15f606f3c5b9e5be5ec2e9b4393b Mon Sep 17 00:00:00 2001 From: elsid Date: Fri, 8 Jul 2022 18:58:23 +0200 Subject: [PATCH] Store RefData::mBaseNode as osg::ref_ptr Direct leak of 16197408 byte(s) in 56241 object(s) allocated from: #0 0x5572356d4d42 in operator new(unsigned long) (/home/elsid/dev/openmw/build/clang/asan/openmw+0xae0d42) #1 0x557236938196 in (anonymous namespace)::addObject(MWWorld::Ptr const&, MWWorld::World const&, std::__1::vector > const&, MWPhysics::PhysicsSystem&, MWRender::RenderingManager&) /home/elsid/dev/openmw/apps/openmw/mwworld/scene.cpp:119:42 #2 0x55723692e51b in MWWorld::Scene::insertCell(MWWorld::CellStore&, Loading::Listener*)::$_7::operator()(MWWorld::Ptr const&) const /home/elsid/dev/openmw/apps/openmw/mwworld/scene.cpp:913:62 #3 0x55723692e51b in void (anonymous namespace)::InsertVisitor::insert(MWWorld::Scene::insertCell(MWWorld::CellStore&, Loading::Listener*)::$_7&&) /home/elsid/dev/openmw/apps/openmw/mwworld/scene.cpp:230:21 #4 0x55723692e51b in MWWorld::Scene::insertCell(MWWorld::CellStore&, Loading::Listener*) /home/elsid/dev/openmw/apps/openmw/mwworld/scene.cpp:913:23 #5 0x55723692d451 in MWWorld::Scene::loadCell(MWWorld::CellStore*, Loading::Listener*, bool, osg::Vec3f const&) /home/elsid/dev/openmw/apps/openmw/mwworld/scene.cpp:449:9 #6 0x5572369299f5 in MWWorld::Scene::changeCellGrid(osg::Vec3f const&, int, int, bool) /home/elsid/dev/openmw/apps/openmw/mwworld/scene.cpp:612:17 #7 0x557236928521 in MWWorld::Scene::update(float) /home/elsid/dev/openmw/apps/openmw/mwworld/scene.cpp:315:13 #8 0x5572368d4c98 in MWWorld::World::update(float, bool) /home/elsid/dev/openmw/apps/openmw/mwworld/worldimp.cpp:1833:22 #9 0x557236ebbb72 in OMW::Engine::frame(float) /home/elsid/dev/openmw/apps/openmw/engine.cpp:418:25 #10 0x557236ed250a in OMW::Engine::go() /home/elsid/dev/openmw/apps/openmw/engine.cpp:1102:14 #11 0x557236eb621a in runApplication(int, char**) /home/elsid/dev/openmw/apps/openmw/main.cpp:228:17 #12 0x55723774d622 in wrapApplication(int (*)(int, char**), int, char**, std::__1::basic_string, std::__1::allocator > const&, bool) /home/elsid/dev/openmw/components/debug/debugging.cpp:328:19 #13 0x557236eb651f in main /home/elsid/dev/openmw/apps/openmw/main.cpp:240:12 #14 0x7fbf58a3f2cf (/usr/lib/libc.so.6+0x232cf) (BuildId: e637217a46491314667a7a37b2155cb07afc1a40) Direct leak of 396288 byte(s) in 1376 object(s) allocated from: #0 0x5572356d4d42 in operator new(unsigned long) (/home/elsid/dev/openmw/build/clang/asan/openmw+0xae0d42) #1 0x557236938196 in (anonymous namespace)::addObject(MWWorld::Ptr const&, MWWorld::World const&, std::__1::vector > const&, MWPhysics::PhysicsSystem&, MWRender::RenderingManager&) /home/elsid/dev/openmw/apps/openmw/mwworld/scene.cpp:119:42 #2 0x55723692e51b in MWWorld::Scene::insertCell(MWWorld::CellStore&, Loading::Listener*)::$_7::operator()(MWWorld::Ptr const&) const /home/elsid/dev/openmw/apps/openmw/mwworld/scene.cpp:913:62 #3 0x55723692e51b in void (anonymous namespace)::InsertVisitor::insert(MWWorld::Scene::insertCell(MWWorld::CellStore&, Loading::Listener*)::$_7&&) /home/elsid/dev/openmw/apps/openmw/mwworld/scene.cpp:230:21 #4 0x55723692e51b in MWWorld::Scene::insertCell(MWWorld::CellStore&, Loading::Listener*) /home/elsid/dev/openmw/apps/openmw/mwworld/scene.cpp:913:23 #5 0x55723692d451 in MWWorld::Scene::loadCell(MWWorld::CellStore*, Loading::Listener*, bool, osg::Vec3f const&) /home/elsid/dev/openmw/apps/openmw/mwworld/scene.cpp:449:9 #6 0x5572369299f5 in MWWorld::Scene::changeCellGrid(osg::Vec3f const&, int, int, bool) /home/elsid/dev/openmw/apps/openmw/mwworld/scene.cpp:612:17 #7 0x557236936eb2 in MWWorld::Scene::changeToExteriorCell(ESM::Position const&, bool, bool) /home/elsid/dev/openmw/apps/openmw/mwworld/scene.cpp:888:9 #8 0x55723689a5ac in MWWorld::World::changeToExteriorCell(ESM::Position const&, bool, bool) /home/elsid/dev/openmw/apps/openmw/mwworld/worldimp.cpp:1003:22 #9 0x5572368c249d in MWWorld::World::changeToCell(ESM::CellId const&, ESM::Position const&, bool, bool) /home/elsid/dev/openmw/apps/openmw/mwworld/worldimp.cpp:1014:13 #10 0x557236e9bbce in MWState::StateManager::loadGame(MWState::Character const*, std::__1::basic_string, std::__1::allocator > const&) /home/elsid/dev/openmw/apps/openmw/mwstate/statemanagerimp.cpp:545:52 #11 0x557236e998db in MWState::StateManager::loadGame(std::__1::basic_string, std::__1::allocator > const&) /home/elsid/dev/openmw/apps/openmw/mwstate/statemanagerimp.cpp:377:17 #12 0x557236ed18fb in OMW::Engine::go() /home/elsid/dev/openmw/apps/openmw/engine.cpp:1066:24 #13 0x557236eb621a in runApplication(int, char**) /home/elsid/dev/openmw/apps/openmw/main.cpp:228:17 #14 0x55723774d622 in wrapApplication(int (*)(int, char**), int, char**, std::__1::basic_string, std::__1::allocator > const&, bool) /home/elsid/dev/openmw/components/debug/debugging.cpp:328:19 #15 0x557236eb651f in main /home/elsid/dev/openmw/apps/openmw/main.cpp:240:12 #16 0x7fbf58a3f2cf (/usr/lib/libc.so.6+0x232cf) (BuildId: e637217a46491314667a7a37b2155cb07afc1a40) --- apps/openmw/mwworld/containerstore.cpp | 1 + apps/openmw/mwworld/refdata.cpp | 9 +++++---- apps/openmw/mwworld/refdata.hpp | 10 ++++++---- 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/apps/openmw/mwworld/containerstore.cpp b/apps/openmw/mwworld/containerstore.cpp index d73fb7dc19..552a5c2388 100644 --- a/apps/openmw/mwworld/containerstore.cpp +++ b/apps/openmw/mwworld/containerstore.cpp @@ -7,6 +7,7 @@ #include #include #include +#include #include "../mwbase/environment.hpp" #include "../mwbase/world.hpp" diff --git a/apps/openmw/mwworld/refdata.cpp b/apps/openmw/mwworld/refdata.cpp index b3515c838f..87bae97cc3 100644 --- a/apps/openmw/mwworld/refdata.cpp +++ b/apps/openmw/mwworld/refdata.cpp @@ -1,6 +1,7 @@ #include "refdata.hpp" #include +#include #include "customdata.hpp" #include "cellstore.hpp" @@ -140,12 +141,12 @@ namespace MWWorld {} } - RefData::RefData(RefData&& other) noexcept = default; - RefData& RefData::operator=(RefData&& other) noexcept = default; + RefData::RefData(RefData&& other) = default; + RefData& RefData::operator=(RefData&& other) = default; - void RefData::setBaseNode(SceneUtil::PositionAttitudeTransform *base) + void RefData::setBaseNode(osg::ref_ptr base) { - mBaseNode = base; + mBaseNode = std::move(base); } SceneUtil::PositionAttitudeTransform* RefData::getBaseNode() diff --git a/apps/openmw/mwworld/refdata.hpp b/apps/openmw/mwworld/refdata.hpp index 5c94dbcacf..5174973d6d 100644 --- a/apps/openmw/mwworld/refdata.hpp +++ b/apps/openmw/mwworld/refdata.hpp @@ -7,6 +7,8 @@ #include "../mwscript/locals.hpp" #include "../mwworld/customdata.hpp" +#include + #include #include @@ -34,7 +36,7 @@ namespace MWWorld class RefData { - SceneUtil::PositionAttitudeTransform* mBaseNode; + osg::ref_ptr mBaseNode; MWScript::Locals mLocals; std::shared_ptr mLuaScripts; @@ -78,7 +80,7 @@ namespace MWWorld /// perform these operations). RefData (const RefData& refData); - RefData (RefData&& other) noexcept; + RefData (RefData&& other); ~RefData(); @@ -87,7 +89,7 @@ namespace MWWorld /// perform this operations). RefData& operator= (const RefData& refData); - RefData& operator= (RefData&& other) noexcept; + RefData& operator= (RefData&& other); /// Return base node (can be a null pointer). SceneUtil::PositionAttitudeTransform* getBaseNode(); @@ -96,7 +98,7 @@ namespace MWWorld const SceneUtil::PositionAttitudeTransform* getBaseNode() const; /// Set base node (can be a null pointer). - void setBaseNode (SceneUtil::PositionAttitudeTransform* base); + void setBaseNode(osg::ref_ptr base); int getCount(bool absolute = true) const;