Как включить умные указатели в функцию члена класса для распределения в реальном времени? - PullRequest
0 голосов
/ 12 февраля 2019

Я создаю новые указатели объектов во время выполнения для N камер с использованием необработанных указателей.Эти указатели создаются в функции-члене класса, и каждый из них обслуживает свой собственный поток - я не уверен, если / как использовать умные указатели вместо «новых» для размещения указателей объектов в куче.Позже я удаляю их в деструкторе, но я бы предпочел более чистый подход к управлению памятью, чем использование сырых указателей.

Как общий, так и уникальный указатель, кажется, разрушаются в конце области видимости, если инициализируются в функции-члене класса.Мне также нужно определить количество камер во время выполнения.

В настоящее время:

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]);
          ....
  }
}

В идеале, я хочу эти указатели камерыосвободить, когда класс освобождает - есть ли способ «связать» деструктор умного указателя с деструктором другого объекта?

1 Ответ

0 голосов
/ 13 февраля 2019

Ключ заключается в том, чтобы держать умные указатели Camera в области действия вместе с классом.

Следующая попытка из этого вопроса имеет правильную идею, но, к сожалению, cam создается и уничтожается на каждой итерации:

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

The Camera s можно сохранить в области видимости, сохраняя общие указатели в векторе-члене.Таким образом, когда 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

Конечно, как упоминалось в комментариях выше, может быть проще, если выхотят, чтобы Camera s существовал в cameraManager, чтобы просто использовать std::vector без std::shared_ptr s.

...