I am getting segmentation failt while assigning the resourcemanager instance

39 views Asked by At

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;
    }
0

There are 0 answers