Ключ заключается в том, чтобы держать умные указатели 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.