diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp
index 48d028f7e6cd9b4d..19f73011f8b75438 100644
--- a/src/libcamera/pipeline/ipu3/ipu3.cpp
+++ b/src/libcamera/pipeline/ipu3/ipu3.cpp
@@ -32,6 +32,8 @@ private:
 	MediaDevice *cio2_;
 	MediaDevice *imgu_;
 
+	std::vector<std::shared_ptr<Camera>> cameras_;
+
 	void registerCameras(CameraManager *manager);
 };
 
@@ -42,6 +44,8 @@ PipelineHandlerIPU3::PipelineHandlerIPU3()
 
 PipelineHandlerIPU3::~PipelineHandlerIPU3()
 {
+	cameras_.clear();
+
 	if (cio2_)
 		cio2_->release();
 
@@ -173,7 +177,8 @@ void PipelineHandlerIPU3::registerCameras(CameraManager *manager)
 		std::string cameraName = sensor->name() + " " + std::to_string(id);
 		std::shared_ptr<Camera> camera = Camera::create(cameraName,
 								this);
-		manager->addCamera(std::move(camera));
+		cameras_.push_back(camera);
+		manager->addCamera(camera);
 
 		LOG(IPU3, Info)
 			<< "Registered Camera[" << numCameras << "] \""
diff --git a/src/libcamera/pipeline/uvcvideo.cpp b/src/libcamera/pipeline/uvcvideo.cpp
index 3651250b683e7810..2162824eb571fba7 100644
--- a/src/libcamera/pipeline/uvcvideo.cpp
+++ b/src/libcamera/pipeline/uvcvideo.cpp
@@ -24,15 +24,19 @@ public:
 
 private:
 	MediaDevice *dev_;
+	std::shared_ptr<Camera> camera_;
 };
 
 PipelineHandlerUVC::PipelineHandlerUVC()
-	: dev_(nullptr)
+	: dev_(nullptr), camera_(nullptr)
 {
 }
 
 PipelineHandlerUVC::~PipelineHandlerUVC()
 {
+	if (camera_)
+		camera_ = nullptr;
+
 	if (dev_)
 		dev_->release();
 }
@@ -48,8 +52,8 @@ bool PipelineHandlerUVC::match(CameraManager *manager, DeviceEnumerator *enumera
 
 	dev_->acquire();
 
-	std::shared_ptr<Camera> camera = Camera::create(dev_->model(), this);
-	manager->addCamera(std::move(camera));
+	camera_ = Camera::create(dev_->model(), this);
+	manager->addCamera(camera_);
 
 	return true;
 }
diff --git a/src/libcamera/pipeline/vimc.cpp b/src/libcamera/pipeline/vimc.cpp
index 81d8319eb88e06d2..373fc0ee5339f9ae 100644
--- a/src/libcamera/pipeline/vimc.cpp
+++ b/src/libcamera/pipeline/vimc.cpp
@@ -24,15 +24,19 @@ public:
 
 private:
 	MediaDevice *dev_;
+	std::shared_ptr<Camera> camera_;
 };
 
 PipeHandlerVimc::PipeHandlerVimc()
-	: dev_(nullptr)
+	: dev_(nullptr), camera_(nullptr)
 {
 }
 
 PipeHandlerVimc::~PipeHandlerVimc()
 {
+	if (camera_)
+		camera_ = nullptr;
+
 	if (dev_)
 		dev_->release();
 }
@@ -57,9 +61,8 @@ bool PipeHandlerVimc::match(CameraManager *manager, DeviceEnumerator *enumerator
 
 	dev_->acquire();
 
-	std::shared_ptr<Camera> camera = Camera::create("Dummy VIMC Camera",
-							this);
-	manager->addCamera(std::move(camera));
+	camera_ = Camera::create("Dummy VIMC Camera", this);
+	manager->addCamera(camera_);
 
 	return true;
 }
