如何在class成员函数中加入智能指针进行实​​时分配?

How to incorporate smart pointers in class member function for real time allocation?

我正在使用原始指针在运行时为 N 个摄像机创建新的对象指针。这些指针是在 class 成员函数中创建的,它们各自为自己的线程提供服务 - 我不确定 if/how 使用智能指针而不是 "new" 在堆上分配对象指针.后来我在析构函数中删除了它们,但我更喜欢一种比使用原始指针更干净的内存管理方法。

如果在 class 成员函数中初始化,共享指针和唯一指针似乎都在作用域末尾析构。我还需要确定运行时的摄像头数量。

目前:

void cameraManager::scanNetwork(){ 
  for(int i=0; i < this->numCameras; ++i){
      auto * cam = new Camera(this->camConfig[i]);
          ....
  }
}

大致如下:

void cameraManager::scanNetwork(){ 
  for(int i=0; i < this->numCameras; ++i){
      std::shared_ptr<Camera> cam = std::make_shared<Camera>(new Camera)(this->camConfig[i]);
          ....
  }
}

理想情况下,我希望这些相机指针在 class 解除分配时解除分配 - 有没有办法将智能指针的析构函数 "bind" 指向另一个对象的析构函数?

关键是要将 Camera 的智能指针与 class 一起保持在范围内。

问题的以下尝试有正确的想法,但不幸的是 cam 在每次迭代中都会被创建和销毁:

  for(int i=0; i < this->numCameras; ++i){
      std::shared_ptr<Camera> cam = std::make_shared<Camera>(new Camera)(this->camConfig[i]);
          ....
  }

Camera 可以通过将共享指针保留在成员向量中来保留在范围内。这样,当 cameraManager 超出范围时,将为相机调用析构函数:

#include <memory>
#include <vector>
#include <array>

struct camConfiguration { };

struct Camera {
    Camera(camConfiguration) {};
};

struct cameraManager {
    int numCameras;
    std::vector<camConfiguration> camConfig;

    std::vector<std::shared_ptr<Camera>> cameras; // will hold the Cameras
    // or, if you only want the cameras to live in the cameraManager, then
    // std::vector<Camera> cameras; // will hold the Cameras without smart pointers

    cameraManager(int numCameras) : numCameras{numCameras}, camConfig(numCameras) {}
    void scanNetwork();
};

void cameraManager::scanNetwork() {
    for (int i = 0; i < this->numCameras; ++i) {
        // each Camera is added to the cameras vector
        cameras.push_back(std::make_shared<Camera>(this->camConfig[i]));
    }
}

int main()
{
    // will hold the Cameras that must outlive the cameraManager
    std::vector<std::shared_ptr<Camera>> cameras_to_keep; 

    {
        cameraManager cm{4};
        cm.scanNetwork();

        cameras_to_keep.push_back(cm.cameras[0]);
        cameras_to_keep.push_back(cm.cameras[3]);
    } // shared pointers in cameraManager are destroyed, i.e. Camera 1 & Camera 2 are destroyed

} 
// remaining Cameras in cameras_to_keep are destroyed

当然,如上面的评论所述,如果您只希望 Cameras 存在于 cameraManager 中,则只需使用 std::vector 而无需std::shared_ptrs.