From 8e8d42bfa29252ce18343c15a51f53bfdc4fe350 Mon Sep 17 00:00:00 2001 From: Ivan Savenko Date: Sat, 20 Jan 2024 18:40:03 +0200 Subject: [PATCH] Try to simplify / cleanup code to localize crash --- .../AObjectTypeHandler.cpp | 21 ++++++------------- .../CObjectClassesHandler.cpp | 4 ++-- .../DwellingInstanceConstructor.cpp | 8 +++---- lib/mapping/MapFormatJson.cpp | 4 ++-- 4 files changed, 14 insertions(+), 23 deletions(-) diff --git a/lib/mapObjectConstructors/AObjectTypeHandler.cpp b/lib/mapObjectConstructors/AObjectTypeHandler.cpp index b5ead3f79..a3ed75ef4 100644 --- a/lib/mapObjectConstructors/AObjectTypeHandler.cpp +++ b/lib/mapObjectConstructors/AObjectTypeHandler.cpp @@ -21,17 +21,7 @@ VCMI_LIB_NAMESPACE_BEGIN AObjectTypeHandler::AObjectTypeHandler() = default; - -AObjectTypeHandler::~AObjectTypeHandler() -{ - // FIXME: currently on Android there is a weird crash in destructor of 'base' member - // this code attempts to localize and fix this crash - if (base) - { - base->clear(); - base.reset(); - } -} +AObjectTypeHandler::~AObjectTypeHandler() = default; std::string AObjectTypeHandler::getJsonKey() const { @@ -89,12 +79,12 @@ void AObjectTypeHandler::init(const JsonNode & input) if (base) JsonUtils::inherit(entry.second, *base); - auto * tmpl = new ObjectTemplate; + auto tmpl = std::make_shared(); tmpl->id = Obj(type); tmpl->subid = subtype; tmpl->stringID = entry.first; // FIXME: create "fullID" - type.object.template? tmpl->readJson(entry.second); - templates.push_back(std::shared_ptr(tmpl)); + templates.push_back(tmpl); } for(const JsonNode & node : input["sounds"]["ambient"].Vector()) @@ -188,12 +178,13 @@ void AObjectTypeHandler::addTemplate(JsonNode config) config.setType(JsonNode::JsonType::DATA_STRUCT); // ensure that input is not null if (base) JsonUtils::inherit(config, *base); - auto * tmpl = new ObjectTemplate; + + auto tmpl = std::make_shared(); tmpl->id = Obj(type); tmpl->subid = subtype; tmpl->stringID.clear(); // TODO? tmpl->readJson(config); - templates.emplace_back(tmpl); + templates.push_back(tmpl); } std::vector> AObjectTypeHandler::getTemplates() const diff --git a/lib/mapObjectConstructors/CObjectClassesHandler.cpp b/lib/mapObjectConstructors/CObjectClassesHandler.cpp index 2c758b0f6..de608e33d 100644 --- a/lib/mapObjectConstructors/CObjectClassesHandler.cpp +++ b/lib/mapObjectConstructors/CObjectClassesHandler.cpp @@ -109,13 +109,13 @@ std::vector CObjectClassesHandler::loadLegacyData() for (size_t i = 0; i < totalNumber; i++) { - auto * tmpl = new ObjectTemplate; + auto tmpl = std::make_shared(); tmpl->readTxt(parser); parser.endLine(); std::pair key(tmpl->id, tmpl->subid); - legacyTemplates.insert(std::make_pair(key, std::shared_ptr(tmpl))); + legacyTemplates.insert(std::make_pair(key, tmpl)); } objects.resize(256); diff --git a/lib/mapObjectConstructors/DwellingInstanceConstructor.cpp b/lib/mapObjectConstructors/DwellingInstanceConstructor.cpp index 6a137b976..ea86a5cb8 100644 --- a/lib/mapObjectConstructors/DwellingInstanceConstructor.cpp +++ b/lib/mapObjectConstructors/DwellingInstanceConstructor.cpp @@ -35,17 +35,17 @@ void DwellingInstanceConstructor::initTypeData(const JsonNode & input) const auto totalLevels = levels.size(); availableCreatures.resize(totalLevels); - for(auto currentLevel = 0; currentLevel < totalLevels; currentLevel++) + for(int currentLevel = 0; currentLevel < totalLevels; currentLevel++) { const JsonVector & creaturesOnLevel = levels[currentLevel].Vector(); const auto creaturesNumber = creaturesOnLevel.size(); availableCreatures[currentLevel].resize(creaturesNumber); - for(auto currentCreature = 0; currentCreature < creaturesNumber; currentCreature++) + for(int currentCreature = 0; currentCreature < creaturesNumber; currentCreature++) { - VLC->identifiers()->requestIdentifier("creature", creaturesOnLevel[currentCreature], [=] (si32 index) + VLC->identifiers()->requestIdentifier("creature", creaturesOnLevel[currentCreature], [this, currentLevel, currentCreature] (si32 index) { - availableCreatures[currentLevel][currentCreature] = VLC->creh->objects[index]; + availableCreatures.at(currentLevel).at(currentCreature) = VLC->creh->objects[index]; }); } assert(!availableCreatures[currentLevel].empty()); diff --git a/lib/mapping/MapFormatJson.cpp b/lib/mapping/MapFormatJson.cpp index 7f6059400..ca4b706fb 100644 --- a/lib/mapping/MapFormatJson.cpp +++ b/lib/mapping/MapFormatJson.cpp @@ -1074,14 +1074,14 @@ void CMapLoaderJson::MapObjectLoader::construct() auto handler = VLC->objtypeh->getHandlerFor( ModScope::scopeMap(), typeName, subtypeName); - auto * appearance = new ObjectTemplate; + auto appearance = std::make_shared(); appearance->id = Obj(handler->getIndex()); appearance->subid = handler->getSubIndex(); appearance->readJson(configuration["template"], false); // Will be destroyed soon and replaced with shared template - instance = handler->create(std::shared_ptr(appearance)); + instance = handler->create(appearance); instance->id = ObjectInstanceID(static_cast(owner->map->objects.size())); instance->instanceName = jsonKey;