Просмотр исходного кода

storage: fix an issue with in-place delete after the changes for reentrant destructors

skypjack 5 часов назад
Родитель
Сommit
1dcd7aab65
1 измененных файлов с 4 добавлено и 3 удалено
  1. 4 3
      src/entt/entity/storage.hpp

+ 4 - 3
src/entt/entity/storage.hpp

@@ -255,8 +255,8 @@ class basic_storage: public basic_sparse_set<Entity, typename stl::allocator_tra
         return it;
     }
 
-    void shrink_to_size() {
-        const auto from = (base_type::size() + traits_type::page_size - 1u) / traits_type::page_size;
+    void shrink_to_size(const bool assume_empty = false) {
+        const auto from = assume_empty ? 0u : (base_type::size() + traits_type::page_size - 1u) / traits_type::page_size;
         allocator_type allocator{get_allocator()};
 
         for(auto pos = from, last = payload.size(); pos < last; ++pos) {
@@ -447,7 +447,8 @@ public:
     // NOLINTNEXTLINE(bugprone-exception-escape)
     ~basic_storage() override {
         pop_all();
-        shrink_to_size();
+        // skip tombstones when shrinking
+        shrink_to_size(true);
     }
 
     /**