Fix [#34005] blender will close immediately in debug mode on deleting objects
authorSergej Reich <sergej.reich@googlemail.com>
Sat, 26 Jan 2013 17:38:45 +0000 (17:38 +0000)
committerSergej Reich <sergej.reich@googlemail.com>
Sat, 26 Jan 2013 17:38:45 +0000 (17:38 +0000)
Was silly mistake from rigidbody merge, base was used after it's been
freed.

Now don't free base in BKE_scene_base_remove() and rename it to
BKE_scene_base_unlink().

source/blender/blenkernel/BKE_scene.h
source/blender/blenkernel/intern/scene.c
source/blender/editors/object/object_add.c
source/blender/editors/object/object_relations.c
source/blender/makesrna/intern/rna_scene.c

index 2ac32a3f651dfb6e9a9b061300e2986c464403dd..9bf0991272ac40dc2ab4ded90f0b0dc0c2f66e8f 100644 (file)
@@ -72,7 +72,7 @@ struct Scene *BKE_scene_add(struct Main *bmain, const char *name);
 /* base functions */
 struct Base *BKE_scene_base_find(struct Scene *scene, struct Object *ob);
 struct Base *BKE_scene_base_add(struct Scene *sce, struct Object *ob);
-void         BKE_scene_base_remove(struct Scene *sce, struct Base *base);
+void         BKE_scene_base_unlink(struct Scene *sce, struct Base *base);
 void         BKE_scene_base_deselect_all(struct Scene *sce);
 void         BKE_scene_base_select(struct Scene *sce, struct Base *selbase);
 int          BKE_scene_base_iter_next(struct Scene **scene, int val, struct Base **base, struct Object **ob);
index fa3dac67a7f99566bd10a972f13b2ecfcabf4a33..9e8cf985f71693590cc4132430f4d839c626d2b5 100644 (file)
@@ -941,7 +941,7 @@ Base *BKE_scene_base_add(Scene *sce, Object *ob)
        return b;
 }
 
-void BKE_scene_base_remove(Scene *sce, Base *base)
+void BKE_scene_base_unlink(Scene *sce, Base *base)
 {
        /* remove rigid body constraint from world before removing object */
        if (base->object->rigidbody_constraint)
@@ -951,7 +951,6 @@ void BKE_scene_base_remove(Scene *sce, Base *base)
                BKE_rigidbody_remove_object(sce, base->object);
        
        BLI_remlink(&sce->base, base);
-       MEM_freeN(base);
 }
 
 void BKE_scene_base_deselect_all(Scene *sce)
index 9c829a06cd2fb41ec42c332daedacbed0596cc9f..8457b278c6c208ae1252c2e8bcc0a20376185770 100644 (file)
@@ -941,10 +941,11 @@ static void object_delete_check_glsl_update(Object *ob)
 void ED_base_object_free_and_unlink(Main *bmain, Scene *scene, Base *base)
 {
        DAG_id_type_tag(bmain, ID_OB);
-       BKE_scene_base_remove(scene, base);
+       BKE_scene_base_unlink(scene, base);
        object_delete_check_glsl_update(base->object);
        BKE_libblock_free_us(&bmain->object, base->object);
        if (scene->basact == base) scene->basact = NULL;
+       MEM_freeN(base);
 }
 
 static int object_delete_exec(bContext *C, wmOperator *op)
index 68d7dcafd9c2110779674cb041ebb01d025dab56..9749494bc661496d8937b676353ffff263be7934 100644 (file)
@@ -354,7 +354,8 @@ static int make_proxy_exec(bContext *C, wmOperator *op)
                
                /* remove base, leave user count of object, it gets linked in BKE_object_make_proxy */
                if (gob == NULL) {
-                       BKE_scene_base_remove(scene, oldbase);
+                       BKE_scene_base_unlink(scene, oldbase);
+                       MEM_freeN(oldbase);
                }
                
                BKE_object_make_proxy(newob, ob, gob);
index 705ac09382dc2473d0df322ae3b16d524e8efcba..7304f7c9a4914bbea68410b14ec9cce661faa6e7 100644 (file)
@@ -406,7 +406,8 @@ static void rna_Scene_object_unlink(Scene *scene, ReportList *reports, Object *o
                scene->basact = NULL;
        }
 
-       BKE_scene_base_remove(scene, base);
+       BKE_scene_base_unlink(scene, base);
+       MEM_freeN(base);
 
        ob->id.us--;