Merge pull request #13642 from wwmayer/fix_memory_leaks
Fix memory leaks
This commit is contained in:
@@ -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");
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -54,6 +54,7 @@ public:
|
||||
MaterialManager();
|
||||
~MaterialManager() override = default;
|
||||
|
||||
static void cleanup();
|
||||
static std::shared_ptr<Material> defaultMaterial();
|
||||
static QString defaultMaterialUUID();
|
||||
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -44,6 +44,7 @@ public:
|
||||
ModelManager();
|
||||
~ModelManager() override = default;
|
||||
|
||||
static void cleanup();
|
||||
void refresh();
|
||||
|
||||
std::shared_ptr<std::list<std::shared_ptr<ModelLibrary>>> getModelLibraries()
|
||||
|
||||
Reference in New Issue
Block a user