Merge pull request #13642 from wwmayer/fix_memory_leaks

Fix memory leaks
This commit is contained in:
Chris Hennes
2024-04-29 10:57:51 -05:00
committed by GitHub
11 changed files with 180 additions and 11 deletions

View File

@@ -27,7 +27,10 @@
#include <Base/Interpreter.h>
#include <Base/PyObjectBase.h>
#include <App/CleanupProcess.h>
#include "MaterialFilterPy.h"
#include "MaterialLoader.h"
#include "MaterialManagerPy.h"
#include "MaterialPy.h"
#include "ModelManagerPy.h"
@@ -61,6 +64,12 @@ PyObject* initModule()
PyMOD_INIT_FUNC(Materials)
{
#ifdef FC_DEBUG
App::CleanupProcess::registerCleanup([](){
Materials::MaterialManager::cleanup();
Materials::ModelManager::cleanup();
});
#endif
PyObject* module = Materials::initModule();
Base::Console().Log("Loading Material module... done\n");

View File

@@ -77,6 +77,21 @@ void MaterialManager::initLibraries()
}
}
void MaterialManager::cleanup()
{
if (_libraryList) {
_libraryList->clear();
}
if (_materialMap) {
for (auto& it : *_materialMap) {
// This is needed to resolve cyclic dependencies
it.second->setLibrary(nullptr);
}
_materialMap->clear();
}
}
void MaterialManager::saveMaterial(const std::shared_ptr<MaterialLibrary>& library,
const std::shared_ptr<Material>& material,
const QString& path,

View File

@@ -54,6 +54,7 @@ public:
MaterialManager();
~MaterialManager() override = default;
static void cleanup();
static std::shared_ptr<Material> defaultMaterial();
static QString defaultMaterialUUID();

View File

@@ -235,7 +235,7 @@ void ModelLoader::addToTree(std::shared_ptr<ModelEntry> model,
Model::ModelType type =
(base == "Model") ? Model::ModelType_Physical : Model::ModelType_Appearance;
Model* finalModel = new Model(library, type, name, directory, uuid, description, url, doi);
Model finalModel(library, type, name, directory, uuid, description, url, doi);
// Add inheritance list
if (yamlModel[base]["Inherits"]) {
@@ -243,7 +243,7 @@ void ModelLoader::addToTree(std::shared_ptr<ModelEntry> model,
for (auto it = inherits.begin(); it != inherits.end(); it++) {
QString nodeName = QString::fromStdString((*it)["UUID"].as<std::string>());
finalModel->addInheritance(nodeName);
finalModel.addInheritance(nodeName);
}
}
@@ -299,11 +299,11 @@ void ModelLoader::addToTree(std::shared_ptr<ModelEntry> model,
property.setInheritance((*inheritances)[key]);
}
finalModel->addProperty(property);
finalModel.addProperty(property);
}
}
(*_modelMap)[uuid] = library->addModel(*finalModel, directory);
(*_modelMap)[uuid] = library->addModel(finalModel, directory);
}
void ModelLoader::loadLibrary(std::shared_ptr<ModelLibrary> library)
@@ -330,16 +330,14 @@ void ModelLoader::loadLibrary(std::shared_ptr<ModelLibrary> library)
}
}
std::map<std::pair<QString, QString>, QString>* inheritances =
new std::map<std::pair<QString, QString>, QString>();
std::map<std::pair<QString, QString>, QString> inheritances;
for (auto it = _modelEntryMap->begin(); it != _modelEntryMap->end(); it++) {
dereference(it->second, inheritances);
dereference(it->second, &inheritances);
}
for (auto it = _modelEntryMap->begin(); it != _modelEntryMap->end(); it++) {
addToTree(it->second, inheritances);
addToTree(it->second, &inheritances);
}
// delete inheritances;
}
void ModelLoader::loadLibraries()

View File

@@ -72,6 +72,21 @@ bool ModelManager::isModel(const QString& file)
return false;
}
void ModelManager::cleanup()
{
if (_libraryList) {
_libraryList->clear();
}
if (_modelMap) {
for (auto& it : *_modelMap) {
// This is needed to resolve cyclic dependencies
it.second->setLibrary(nullptr);
}
_modelMap->clear();
}
}
void ModelManager::refresh()
{
_modelMap->clear();

View File

@@ -44,6 +44,7 @@ public:
ModelManager();
~ModelManager() override = default;
static void cleanup();
void refresh();
std::shared_ptr<std::list<std::shared_ptr<ModelLibrary>>> getModelLibraries()