Address segfault #7215 #7185

This commit is contained in:
Thomas Krijnen
2025-10-08 14:17:47 +02:00
parent 4ab2664529
commit e15f222a19
4 changed files with 15 additions and 8 deletions
+4
View File
@@ -127,6 +127,10 @@ public:
return storage_.byref_excl_;
}
std::vector<std::unique_ptr<IfcUtil::IfcBaseClass>> steal_instances() {
return storage_.steal_instances();
}
InstanceStreamer(const std::string& fn);
InstanceStreamer(void* data, int length);
+4 -1
View File
@@ -725,7 +725,7 @@ void IfcParse::impl::in_memory_file_storage::load(unsigned entity_instance_name,
// the 2nd pass.
load(entity_instance_name, entity, ps, attribute_index == -1 ? (int)attribute_index_within_data : attribute_index);
auto* simple_type_instance = (schema ? schema : file->schema())->instantiate(decl, ps.construct(entity_instance_name, *references_to_resolve, decl, boost::none, attribute_index == -1 ? (int)attribute_index_within_data : attribute_index));
read_simple_type_instances.push_back(simple_type_instance);
read_simple_type_instances.emplace_back(simple_type_instance);
//@todo decide addEntity(((IfcUtil::IfcBaseClass*)*entity));
context.push(simple_type_instance);
simple_type_instance->file_ = file;
@@ -1651,6 +1651,9 @@ void IfcParse::impl::in_memory_file_storage::read_from_stream(IfcParse::IfcSpfSt
good_ = streamer.status();
byref_excl_ = streamer.inverses();
// Move the storage of simple type instances so that they are retained during the lifetime of the file
read_simple_type_instances = streamer.steal_instances();
Logger::Status("\rDone scanning file ");
+5 -6
View File
@@ -189,7 +189,10 @@ namespace IfcParse {
namespace impl {
struct IFC_PARSE_API in_memory_file_storage {
std::vector<IfcUtil::IfcBaseClass*> read_simple_type_instances;
std::vector<std::unique_ptr<IfcUtil::IfcBaseClass>> read_simple_type_instances;
std::vector<std::unique_ptr<IfcUtil::IfcBaseClass>> steal_instances() {
return std::move(read_simple_type_instances);
}
IfcParse::IfcSpfLexer* tokens;
// IfcParse::IfcSpfStream* stream;
@@ -214,14 +217,10 @@ namespace IfcParse {
typedef entity_instance_by_name_t::iterator iterator;
in_memory_file_storage(IfcParse::IfcFile* f = nullptr) : tokens(nullptr), file(f), schema(nullptr) {}
~in_memory_file_storage() {
for (auto* inst : read_simple_type_instances) {
delete inst;
}
}
in_memory_file_storage(const in_memory_file_storage&) = delete;
in_memory_file_storage(const in_memory_file_storage&&) = delete;
class type_iterator : public entities_by_type_t::const_iterator {
public:
using iterator_category = std::forward_iterator_tag;
+2 -1
View File
@@ -259,7 +259,8 @@ void RocksDbSerializer::write_streaming_() {
}
// @nb we also need to delete them
delete inst;
// not anymore, as they are now registered as unique_ptr in the in_memory_file_storage
// delete inst;
}
// Entity type as numeric ref to index_in_schema