summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorDavid Snopek <dsnopek@gmail.com>2023-10-05 11:07:11 -0500
committerGitHub <noreply@github.com>2023-10-05 11:07:11 -0500
commitef2f63a00c5496cc325e8546acd743787e87a83d (patch)
tree7d32c6d64e627de1f7c52affaf4a9f35d974a16a /src
parentcd61a9bbe881b902750111eac8b02c04778f366b (diff)
parent5134c82573b727887b4f8dbd574c4db954298452 (diff)
downloadredot-cpp-ef2f63a00c5496cc325e8546acd743787e87a83d.tar.gz
Merge pull request #1260 from Klaim/master
Fixes crash in ClassDB::deinitialize due to usage of invalid iterator.
Diffstat (limited to 'src')
-rw-r--r--src/core/class_db.cpp15
1 files changed, 12 insertions, 3 deletions
diff --git a/src/core/class_db.cpp b/src/core/class_db.cpp
index 7219a79..1f4b135 100644
--- a/src/core/class_db.cpp
+++ b/src/core/class_db.cpp
@@ -352,6 +352,7 @@ void ClassDB::initialize(GDExtensionInitializationLevel p_level) {
}
void ClassDB::deinitialize(GDExtensionInitializationLevel p_level) {
+ std::set<StringName> to_erase;
for (std::vector<StringName>::reverse_iterator i = class_register_order.rbegin(); i != class_register_order.rend(); ++i) {
const StringName &name = *i;
const ClassInfo &cl = classes[name];
@@ -362,12 +363,20 @@ void ClassDB::deinitialize(GDExtensionInitializationLevel p_level) {
internal::gdextension_interface_classdb_unregister_extension_class(internal::library, name._native_ptr());
- for (auto method : cl.method_map) {
+ for (const std::pair<const StringName, MethodBind *> &method : cl.method_map) {
memdelete(method.second);
}
- classes.erase(*i);
- class_register_order.erase((i + 1).base());
+ classes.erase(name);
+ to_erase.insert(name);
+ }
+
+ {
+ // The following is equivalent to c++20 `std::erase_if(class_register_order, [&](const StringName& name){ return to_erase.contains(name); });`
+ std::vector<StringName>::iterator it = std::remove_if(class_register_order.begin(), class_register_order.end(), [&](const StringName &p_name) {
+ return to_erase.count(p_name) > 0;
+ });
+ class_register_order.erase(it, class_register_order.end());
}
}