C++ 创建新对象会销毁C+中具有不同名称的旧对象+;

C++ 创建新对象会销毁C+中具有不同名称的旧对象+;,c++,visual-c++,pointers,object,C++,Visual C++,Pointers,Object,第一个问题 >,我在VisualC++ 2008中指针有一些问题。我正在写一个程序,它将控制六个摄像头,并对它们进行一些处理,所以为了清理这些东西,我创建了一个摄像头管理器类。此类处理将在所有摄影机上执行的所有操作。下面是一个Camera类,它与每个单独的Camera驱动程序交互,并执行一些基本的图像处理 现在的想法是,当管理器初始化时,它会创建两个摄像头,并将它们添加到向量中,以便我以后可以访问它们。这里需要注意的是,当我创建第二个摄影机(camera2)时,出于某种原因会调用第一个摄影机的

第一个问题

>,我在VisualC++ 2008中指针有一些问题。我正在写一个程序,它将控制六个摄像头,并对它们进行一些处理,所以为了清理这些东西,我创建了一个摄像头管理器类。此类处理将在所有摄影机上执行的所有操作。下面是一个Camera类,它与每个单独的Camera驱动程序交互,并执行一些基本的图像处理

现在的想法是,当管理器初始化时,它会创建两个摄像头,并将它们添加到向量中,以便我以后可以访问它们。这里需要注意的是,当我创建第二个摄影机(camera2)时,出于某种原因会调用第一个摄影机的析构函数,然后该析构函数会断开摄影机的连接

通常我会假设问题出在Camera类中的某个地方,但在这种情况下,只要我不创建camera2对象,一切都能正常工作

出什么事了

CameraManager.h:

#include "stdafx.h"

#include <vector>
#include "Camera.h"

class CameraManager{

    std::vector<Camera>     cameras;

public:

    CameraManager();
    ~CameraManager();

    void CaptureAll();
    void ShowAll();

};
照相机

#include "stdafx.h"

// OpenCV
#include <cv.h>
#include <highgui.h>

// cvBlob
#include "cvblob.h"

// FirePackage
#include <fgcamera.h>

using namespace cvb;

class Camera{

public:

    int cameraID;

    double x, y,z, FOVx, FOVy;

    IplImage *image, *backgroundImage, *labeledImage; 

    CvBlobs   blobs;

    Camera(FGNODEINFO NodeInfo[], int camID, float xin, float yin, float zin);

    ~Camera();

    void QueryFrame();

    void ProcessFrame();

    void GrabBackground();

    void LoadCalibration();

    void Show();

private:

    // ======= FirePackage  ======
    CFGCamera  FGCamera;
    UINT32     Result;
    FGNODEINFO MyNodeInfo;
    UINT32     NodeCnt;
    FGFRAME    Frame;

    // ======= Camera Configuration  ======
    // Trigger Settings
    UINT32  nOn, nPolarity, nSrc, nMode, nParm, BurstCount, DMAMode;

    // Image Settings
    UINT32  AutoExposure, Shutter, Gain, Brightness, Gamma;

    // Image Format Settings
    UINT32  Format, Mode, Resolution, ColorFormat, FrameRate;

    // Structures
    UINT32  TriggerValue;
    UINT32  FormatValue;
    UINT32  DFormatValue;

    // OpenCV Calibration matrices
    CvMat    *intrinsics, *distortion;  
    IplImage *mapx, *mapy;

    void SetUpFirePackage();

    void SetUpOpenCV();

};

您需要弄清楚对象和指向对象的指针之间的区别

您的
CameraManager
包含
Camera
vector
,因此您必须期望在矢量展开时复制相机。这意味着将在容器生命周期的某些点创建副本并销毁旧副本

此调用将参数的副本(camera1所指向的摄影机)推送到向量中

cameras.push_back(*camera1);
当第二个
摄像机
被推入向量时,被销毁的不是
摄像机1
指向的
摄像机
,而是被推入
向量
的该
摄像机
的副本。作为旁注,当
camera1
指向您使用
new
动态分配的对象,但您不
删除该对象时,内存(和对象)泄漏


听起来好像您还没有准备好复制
相机
对象。这可能是因为你最好使用一个指针容器(或智能指针来帮助清理释放),或者你可以改变
相机
类的工作方式来正确处理被复制的内容。如果看不到
Camera
类,就很难知道哪个更合适。

您需要弄清楚对象和指向对象的指针之间的区别

您的
CameraManager
包含
Camera
vector
,因此您必须期望在矢量展开时复制相机。这意味着将在容器生命周期的某些点创建副本并销毁旧副本

此调用将参数的副本(camera1所指向的摄影机)推送到向量中

cameras.push_back(*camera1);
当第二个
摄像机
被推入向量时,被销毁的不是
摄像机1
指向的
摄像机
,而是被推入
向量
的该
摄像机
的副本。作为旁注,当
camera1
指向您使用
new
动态分配的对象,但您不
删除该对象时,内存(和对象)泄漏


听起来好像您还没有准备好复制
相机
对象。这可能是因为你最好使用一个指针容器(或智能指针来帮助清理释放),或者你可以改变
相机
类的工作方式来正确处理被复制的内容。如果看不到
Camera
类,就很难知道哪个更合适。

您在
Camera
类中存储原始指针,但没有定义复制构造函数或赋值运算符(这两者都是
std::vector
正确工作所必需的)。因此,您可以得到编译器生成的版本,这些版本可以进行浅拷贝

由于使用了
摄像头。向后推(*camera1)
,实际上您正在创建一个临时文件,该文件在
推回返回后被销毁。这个临时的析构函数将释放您在语句
Camera*camera1=newcamera(NodeInfo,1,-44,0,0)中分配的资源,并且向量中的实例将具有指向不再有效的资源的指针

您需要在向量中不存储
摄影机
by值(使用某种类型的共享指针),并显式地将类型标记为不可复制/可分配,或者提供必要的复制/分配语义


此外,更不用说您正在泄漏
camera1
camera2
您正在
Camera
类中存储原始指针,但没有定义复制构造函数或赋值操作符(这两种都是
std::vector
正确工作所必需的)。因此,您可以得到编译器生成的版本,这些版本可以进行浅拷贝

由于使用了
摄像头。向后推(*camera1)
,实际上您正在创建一个临时文件,该文件在
推回返回后被销毁。这个临时的析构函数将释放您在语句
Camera*camera1=newcamera(NodeInfo,1,-44,0,0)中分配的资源,并且向量中的实例将具有指向不再有效的资源的指针

您需要在向量中不存储
摄影机
by值(使用某种类型的共享指针),并显式地将类型标记为不可复制/可分配,或者提供必要的复制/分配语义


另外,更不用说你泄漏了
camera1
camera2

是什么让你认为camera1被破坏了?不应该是这样的,基于此代码,通过代码逐步查看,创建camera2后,执行进入Camera::~Camera,它会关闭与物理设备的连接
cameras.push_back(*camera1);