Fix #132831: memory leak when deleting simulation zone
The leak happened because the bake data of the removed zone was only partially freed. Pull Request: https://projects.blender.org/blender/blender/pulls/132867
This commit is contained in:
@@ -10,6 +10,7 @@ struct NodesModifierData;
|
||||
struct NodesModifierDataBlock;
|
||||
struct Object;
|
||||
struct NodesModifierPackedBake;
|
||||
struct NodesModifierBake;
|
||||
|
||||
namespace blender::bke::bake {
|
||||
struct ModifierCache;
|
||||
@@ -45,5 +46,6 @@ struct NodesModifierRuntime {
|
||||
|
||||
void nodes_modifier_data_block_destruct(NodesModifierDataBlock *data_block, bool do_id_user);
|
||||
void nodes_modifier_packed_bake_free(NodesModifierPackedBake *packed_bake);
|
||||
void nodes_modifier_bake_destruct(NodesModifierBake *bake, bool do_id_user);
|
||||
|
||||
} // namespace blender
|
||||
|
||||
@@ -378,8 +378,11 @@ static void update_bakes_from_node_group(NodesModifierData &nmd)
|
||||
NodesModifierBake &new_bake = new_bake_data[i];
|
||||
if (old_bake) {
|
||||
new_bake = *old_bake;
|
||||
/* The ownership of the string was moved to `new_bake`. */
|
||||
/* The ownership of this data was moved to `new_bake`. */
|
||||
old_bake->directory = nullptr;
|
||||
old_bake->data_blocks = nullptr;
|
||||
old_bake->data_blocks_num = 0;
|
||||
old_bake->packed = nullptr;
|
||||
}
|
||||
else {
|
||||
new_bake.id = id;
|
||||
@@ -390,7 +393,7 @@ static void update_bakes_from_node_group(NodesModifierData &nmd)
|
||||
}
|
||||
|
||||
for (NodesModifierBake &old_bake : MutableSpan(nmd.bakes, nmd.bakes_num)) {
|
||||
MEM_SAFE_FREE(old_bake.directory);
|
||||
nodes_modifier_bake_destruct(&old_bake, true);
|
||||
}
|
||||
MEM_SAFE_FREE(nmd.bakes);
|
||||
|
||||
@@ -2751,6 +2754,21 @@ void nodes_modifier_packed_bake_free(NodesModifierPackedBake *packed_bake)
|
||||
MEM_SAFE_FREE(packed_bake);
|
||||
}
|
||||
|
||||
void nodes_modifier_bake_destruct(NodesModifierBake *bake, const bool do_id_user)
|
||||
{
|
||||
MEM_SAFE_FREE(bake->directory);
|
||||
|
||||
for (NodesModifierDataBlock &data_block : MutableSpan(bake->data_blocks, bake->data_blocks_num))
|
||||
{
|
||||
nodes_modifier_data_block_destruct(&data_block, do_id_user);
|
||||
}
|
||||
MEM_SAFE_FREE(bake->data_blocks);
|
||||
|
||||
if (bake->packed) {
|
||||
nodes_modifier_packed_bake_free(bake->packed);
|
||||
}
|
||||
}
|
||||
|
||||
static void free_data(ModifierData *md)
|
||||
{
|
||||
NodesModifierData *nmd = reinterpret_cast<NodesModifierData *>(md);
|
||||
@@ -2760,18 +2778,7 @@ static void free_data(ModifierData *md)
|
||||
}
|
||||
|
||||
for (NodesModifierBake &bake : MutableSpan(nmd->bakes, nmd->bakes_num)) {
|
||||
MEM_SAFE_FREE(bake.directory);
|
||||
|
||||
for (NodesModifierDataBlock &data_block : MutableSpan(bake.data_blocks, bake.data_blocks_num))
|
||||
{
|
||||
MEM_SAFE_FREE(data_block.id_name);
|
||||
MEM_SAFE_FREE(data_block.lib_name);
|
||||
}
|
||||
MEM_SAFE_FREE(bake.data_blocks);
|
||||
|
||||
if (bake.packed) {
|
||||
nodes_modifier_packed_bake_free(bake.packed);
|
||||
}
|
||||
nodes_modifier_bake_destruct(&bake, false);
|
||||
}
|
||||
MEM_SAFE_FREE(nmd->bakes);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user