leejet / stable-diffusion.cpp

Stable Diffusion in pure C/C++
MIT License
2.91k stars 233 forks source link

Addressed a double free bug when running on CPU introduced in the last commit as well as an issue loading SDXL LoRAs #200

Closed grauho closed 3 months ago

grauho commented 3 months ago

Fixed a double free issue when running multiple backends on the CPU, eg: CLIP and the primary backend, as this would result in the *_backend pointers both pointing to the same thing resulting in a segfault when calling the StableDiffusionGGML destructor.

az13js commented 3 months ago

I have also encountered this issue. When using it on Windows 11, I encountered a "Segmentation fault". My fix:

$ git diff
diff --git a/stable-diffusion.cpp b/stable-diffusion.cpp
index 4d622dd..1fa115e 100644
--- a/stable-diffusion.cpp
+++ b/stable-diffusion.cpp
@@ -123,9 +123,13 @@ public:

     ~StableDiffusionGGML() {
         ggml_backend_free(backend);
-        ggml_backend_free(clip_backend);
+        if (clip_backend != backend) {
+            ggml_backend_free(clip_backend);
+        }
         ggml_backend_free(control_net_backend);
-        ggml_backend_free(vae_backend);
+        if (vae_backend != backend) {
+            ggml_backend_free(vae_backend);
+        }
     }
leejet commented 3 months ago

Great! Thank you for fixing this problem.