Here is my code snippet I am trying to allocate the camera object from Create call of SomeCmaera. but while executing the below code i am getting segmentation fault at object assignment in opencamera method.
MostImportant: I cannot change the openCmaera method parameters its fixed.
#include <iostream>
#include <vector>
#include <memory>
#include <unordered_map>
class ResourceManager {
public:
void getCamerasource() {
std::cout << "This is an ResourceManager getCamerasource." << std::endl;
}
void startvideo(){
std::cout << "This is an ResourceManager startvideo." << std::endl;
}
void stopvideo(){
std::cout << "This is an ResourceManager stopvideo." << std::endl;
}
releaseCameraSource() {}
};
class ICamera {
public:
virtual void startvideo() =0;
virtual void stopvideo() =0;
virtual ~ICamera() = default;
};
class SomeCamera : public ICamera {
private:
int cameraId;
std::weak_ptr<ResourceManager> ResourceManagerInstance;
public:
SomeCamera(const SomeCamera& ) = delete;
SomeCamera& operator=(const SomeCamera&) = delete;
SomeCamera(int id, std::shared_ptr<ResourceManager>& ebInstance) : cameraId(id), ResourceManagerInstance(ebInstance) {}
static std::shared_ptr<SomeCamera> Create(int id, std::shared_ptr<ResourceManager>& ebInstance);
virtual ~SomeCamera() = default;
void showCamera() {
std::cout << "Camera ID: " << cameraId << std::endl;
auto service = ResourceManagerInstance.lock();
std::cout << "Use count: " << service.use_count() << std::endl;
}
void startvideo(){
std::cout << "SomeCamera startvideo." << std::endl;
auto service = ResourceManagerInstance.lock();
service->startvideo();
}
void stopvideo(){
std::cout << "SomeCamerastopvideo." << std::endl;
auto service = ResourceManagerInstance.lock();
service->stopvideo();
}
};
std::shared_ptr<SomeCamera> SomeCamera::Create(int id, std::shared_ptr<ResourceManager>& ebInstance){
return std::make_shared<SomeCamera>(id,ebInstance);
}
class CameraController {
private:
std::unordered_map<int,std::weak_ptr<SomeCamera>> cameraslist;
std::shared_ptr<ResourceManager> ebInstance;
public:
CameraController() : ebInstance(std::make_shared<ResourceManager>()) {}
void opencamera(int cameraId, std::shared_ptr<ICamera>* obj) {
std::cout << "opencamera "<< cameraId << std::endl;
auto camera = SomeCamera::Create(cameraId,ebInstance);
cameraslist.emplace(cameraId, camera);
*obj = camera;
}
void closecamera(int cameraId) {
std::cout << "close camera "<< cameraId << std::endl;
cameraslist.erase(cameraId);
std::cout << "Remaining camera "<< cameraslist.size() << std::endl;
}
};
int main() {
CameraController enumerator;
std::shared_ptr<ICamera>* obj1;
std::shared_ptr<ICamera>* obj2;
enumerator.opencamera(1,obj1);
enumerator.opencamera(2,obj2);
// (*obj1)->startvideo();
// (*obj2)->startvideo();
//sleep(10);
// (*obj1)->stopvideo();
// (*obj2)->stopvideo();
enumerator.closecamera(1);
enumerator.closecamera(2);
return 0;
}
I am getting segmentation fault while assignment of somecamera object into opencamera of cameracontroller
void opencamera(int cameraId, std::shared_ptr<ICamera>* obj) {
std::cout << "opencamera "<< cameraId << std::endl;
auto camera = SomeCamera::Create(cameraId,ebInstance);
cameraslist.emplace(cameraId, camera);
*obj = camera;
}