如何在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
当然,如上面的评论所述,如果您只希望 Camera
s 存在于 cameraManager
中,则只需使用 std::vector
而无需std::shared_ptr
s.
我正在使用原始指针在运行时为 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
当然,如上面的评论所述,如果您只希望 Camera
s 存在于 cameraManager
中,则只需使用 std::vector
而无需std::shared_ptr
s.