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);