mirror of
https://github.com/OrcaSlicer/OrcaSlicer.git
synced 2026-10-14 03:11:19 +00:00
Free a sharing object's own layers only when it takes over the shared ones
This commit is contained in:
@@ -2971,11 +2971,6 @@ void Print::auto_assign_extruders(ModelObject* model_object) const
|
||||
|
||||
void PrintObject::set_shared_object(PrintObject *object)
|
||||
{
|
||||
// Orca: from now on m_layers / m_support_layers only alias the shared object's layers, so release the
|
||||
// ones this object still owns (it may have sliced itself before it became shareable again).
|
||||
// Both are no-ops once m_shared_object is set, so this cannot free layers owned by another object.
|
||||
clear_support_layers();
|
||||
clear_layers();
|
||||
m_shared_object = object;
|
||||
BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << boost::format(": this=%1%, found shared object from %2%")%this%m_shared_object;
|
||||
}
|
||||
@@ -2996,6 +2991,15 @@ void PrintObject::clear_shared_object()
|
||||
void PrintObject::copy_layers_from_shared_object()
|
||||
{
|
||||
if (m_shared_object) {
|
||||
// Orca: Print::process() calls this once per slice for each sharing object, after clear_shared_object() has
|
||||
// emptied any earlier alias, so the vectors hold only layers this object sliced itself before it started sharing
|
||||
// (or nothing). Free them here, as clear_support_layers() / clear_layers() would; those skip deletion while
|
||||
// m_shared_object is set. The belt-only data they also free is always empty here, because belt printers never
|
||||
// share layers.
|
||||
for (SupportLayer *layer : m_support_layers)
|
||||
delete layer;
|
||||
for (Layer *layer : m_layers)
|
||||
delete layer;
|
||||
m_layers.clear();
|
||||
m_support_layers.clear();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user