首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将智能指针合并到类成员函数中进行实时分配?

如何将智能指针合并到类成员函数中进行实时分配?
EN

Stack Overflow用户
提问于 2019-02-12 20:30:12
回答 1查看 51关注 0票数 2

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

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

目前:

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

类似于这样的东西:

代码语言:javascript
复制
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]);
          ....
  }
}

理想情况下,我希望这些摄像机指针在类释放时释放--是否有一种方法将智能指针的析构函数“绑定”到另一个对象的析构函数?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-02-12 21:18:05

关键是将Camera的智能指针与类一起保持在作用域中。

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

用于(int i=0;inumCamera;++i){ std::shared_ptr凸轮=std::make_shared(新相机)(此->camConfigi);.}

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

代码语言:javascript
复制
#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

当然,正如上面的注释所提到的,如果您只希望Camera存在于cameraManager中,只使用std::vector而不使用std::shared_ptr,则可能会更容易。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54658259

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档