diff --git a/src/App/Extension.cpp b/src/App/Extension.cpp
index 845af10de5..e63bfd59cd 100644
--- a/src/App/Extension.cpp
+++ b/src/App/Extension.cpp
@@ -32,6 +32,7 @@
#include "DocumentObject.h"
#include "Base/Exception.h"
#include
+#include
/* We do not use a standart property macro for type initiation. The reason is that we want to expose all property functions,
* to allow the derived classes to access the private property data, but we do not want to have our
@@ -56,7 +57,17 @@ Extension::Extension()
Extension::~Extension()
{
-
+ Base::Console().Message("Delete extension\n");
+ if (!ExtensionPythonObject.is(Py::_None())){
+ // Remark: The API of Py::Object has been changed to set whether the wrapper owns the passed
+ // Python object or not. In the constructor we forced the wrapper to own the object so we need
+ // not to dec'ref the Python object any more.
+ // But we must still invalidate the Python object because it need not to be
+ // destructed right now because the interpreter can own several references to it.
+ Base::PyObjectBase* obj = (Base::PyObjectBase*)ExtensionPythonObject.ptr();
+ // Call before decrementing the reference counter, otherwise a heap error can occur
+ obj->setInvalid();
+ }
}
void Extension::initExtension(Base::Type type) {
diff --git a/src/App/ExtensionContainer.cpp b/src/App/ExtensionContainer.cpp
index bf32d87608..b3329f1181 100644
--- a/src/App/ExtensionContainer.cpp
+++ b/src/App/ExtensionContainer.cpp
@@ -43,6 +43,11 @@ ExtensionContainer::ExtensionContainer() {
ExtensionContainer::~ExtensionContainer() {
+ //we need to delete all dynamically added extensions
+ for(auto entry : _extensions) {
+ if(entry.second->isPythonExtension())
+ delete entry.second;
+ }
};
void ExtensionContainer::registerExtension(Base::Type extension, Extension* ext) {
diff --git a/src/App/ExtensionContainerPyImp.cpp b/src/App/ExtensionContainerPyImp.cpp
index 284a8a7361..1c800fe141 100644
--- a/src/App/ExtensionContainerPyImp.cpp
+++ b/src/App/ExtensionContainerPyImp.cpp
@@ -175,4 +175,4 @@ PyObject* ExtensionContainerPy::addExtension(PyObject *args) {
}
Py_Return;
-}
\ No newline at end of file
+}
diff --git a/src/App/GroupExtension.cpp b/src/App/GroupExtension.cpp
index deb83361a4..7162a6d411 100644
--- a/src/App/GroupExtension.cpp
+++ b/src/App/GroupExtension.cpp
@@ -45,6 +45,7 @@ GroupExtension::GroupExtension()
GroupExtension::~GroupExtension()
{
+ Base::Console().Message("Delete group extension\n");
}
DocumentObject* GroupExtension::addObject(const char* sType, const char* pObjectName)