C++ 填充向量导致的内存泄漏
我的内存泄漏是由函数转换引起的。 该函数用于将非常大的三维点数据矢量转换为另一个矢量 其他3D点数据的矢量 这是我的密码: IPoint3D.hC++ 填充向量导致的内存泄漏,c++,memory-leaks,C++,Memory Leaks,我的内存泄漏是由函数转换引起的。 该函数用于将非常大的三维点数据矢量转换为另一个矢量 其他3D点数据的矢量 这是我的密码: IPoint3D.h struct IPoint3D { virtual ~IPoint3D() { } float x, y, z; virtual std::string toString() = 0; }; RealSenseCamera.h class RealSenseCamera : public IRealSense
struct IPoint3D
{
virtual ~IPoint3D()
{
}
float x, y, z;
virtual std::string toString() = 0;
};
RealSenseCamera.h
class RealSenseCamera : public IRealSenseCamera
{
public:
RealSenseCamera();
~RealSenseCamera();
CameraInitializationResult CreateSession(int width, int height, int fps) override;
SetSensorConfigurationResult SetSensorConfiguration(pxcBool dsAutoExposure, pxcBool dsCropping, pxcI32 dsGain, pxcI32 laserPower, PXCCapture::Device::IVCAMAccuracy accuracy) override;
bool IsReady() override;
int GetFrameSize() override;
void Destroy() override;
std::vector<IPoint3D*> QueryVertices() override;
private:
int _width, _height, _fps;
PXCSession* _session;
PXCSenseManager* _senseManager;
PXCProjection* _projection;
PXCCapture::Device* _device;
std::vector<IPoint3D*> convert(std::vector<PXCPoint3DF32> source);
};
class RealSenseCamera:公共IRealSenseCamera
{
公众:
RealSenseCamera();
~RealSenseCamera();
CameraInInitializationResult CreateSession(整数宽度、整数高度、整数fps)覆盖;
设置传感器配置结果设置传感器配置(pxcBool dsAutoExposure、pxcBool dsCropping、pxcI32 dsGain、pxcI32 laserPower、PXCCapture::Device::IVCAmAccurance精度)覆盖;
bool IsReady()覆盖;
int GetFrameSize()覆盖;
无效销毁()覆盖;
std::vector QueryVertices()覆盖;
私人:
整数(宽度),整数(高度),整数fps ;;
PXC会话*U会话;
PXC传感器管理器*\U传感器管理器;
PXC投影*U投影;
PXCCapture::设备*\u设备;
std::矢量转换(std::矢量源);
};
RealSenseCamera.cpp
RealSenseCamera::RealSenseCamera() : _width(0), _height(0), _fps(0), _session(nullptr), _senseManager(nullptr), _projection(nullptr), _device(nullptr)
{
}
RealSenseCamera::~RealSenseCamera()
{
}
CameraInitializationResult RealSenseCamera::CreateSession(int width, int height, int fps)
{
_width = width;
_height = height;
_fps = fps;
_session = PXCSession::CreateInstance();
if (_session == nullptr)
return CameraInitializationResult(false, "Failed to create camera session instance.");
_senseManager = _session->CreateSenseManager();
if (_senseManager == nullptr)
return CameraInitializationResult(false, "Failed to create SenseManager.");
_senseManager->EnableStream(PXCCapture::STREAM_TYPE_DEPTH, width, height, fps);
_senseManager->Init();
PXCCaptureManager* captureManager = _senseManager->QueryCaptureManager();
if (captureManager == nullptr)
return CameraInitializationResult(false, "Failed to create CaptureManager.");
_device = captureManager->QueryDevice();
if (_device == nullptr)
return CameraInitializationResult(false, "Failed to create device.");
return CameraInitializationResult(true, "Initialization successful.");
}
bool RealSenseCamera::IsReady()
{
return _session != nullptr && _device != nullptr && _senseManager != nullptr && _senseManager->IsConnected();
}
int RealSenseCamera::GetFrameSize()
{
return _width * _height;
}
SetSensorConfigurationResult RealSenseCamera::SetSensorConfiguration(pxcBool autoExposure, pxcBool cropping, pxcI32 gain, pxcI32 laserPower, PXCCapture::Device::IVCAMAccuracy accuracy)
{
if (_device == nullptr)
return SetSensorConfigurationResult(false, "Failed to find device.");
_device->SetDSLeftRightAutoExposure(autoExposure);
_device->SetDSLeftRightCropping(cropping);
_device->SetDSLeftRightGain(gain);
_device->SetIVCAMLaserPower(laserPower);
_device->SetIVCAMAccuracy(accuracy);
return SetSensorConfigurationResult(true, "New Configuration ist set.");
}
std::vector<IPoint3D*> RealSenseCamera::QueryVertices()
{
std::vector<PXCPoint3DF32> vertices;
if (_senseManager->AcquireFrame(true) >= pxcStatus::PXC_STATUS_NO_ERROR) {
PXCCapture::Sample* _sample = _senseManager->QuerySample();
PXCImage* depthImage = _sample->depth;
vertices.resize(_width * _height);
_projection = _device->CreateProjection();
_projection->QueryVertices(depthImage, &vertices[0]);
}
_senseManager->ReleaseFrame();
// konvertierung leider bisher nötig
return convert(vertices);
}
// Neuer vector wird für Punktdaten angelegt
std::vector<IPoint3D*> RealSenseCamera::convert(std::vector<PXCPoint3DF32> source)
{
int size = GetFrameSize();
std::vector<IPoint3D*> target(size);
for (int i = 0; i < size; i++)
{
target[i] = new PXCPoint3DF32Adapter(source[i]);
}
return target;
}
void RealSenseCamera::Destroy()
{
if (_device != nullptr)
_device->Release();
if (_senseManager != nullptr)
{
_senseManager->Close();
_senseManager->Release();
}
if (_session != nullptr)
_session->Release();
}
RealSenseCamera::RealSenseCamera():_宽度(0),_高度(0),_fps(0),_会话(nullptr),_传感器管理器(nullptr),_投影(nullptr),_设备(nullptr)
{
}
RealSenseCamera::~RealSenseCamera()
{
}
CameraInInitializationResult RealSenseCamera::CreateSession(整数宽度、整数高度、整数fps)
{
_宽度=宽度;
_高度=高度;
_fps=fps;
_session=PXCSession::CreateInstance();
if(_session==nullptr)
返回CameraInInitializationResult(false,“未能创建摄像头会话实例”);
_senseManager=_session->CreateSenseManager();
如果(_senseManager==nullptr)
返回CameraInInitializationResult(false,“未能创建SenseManager”);
_senseManager->EnableStream(PXCCapture::STREAM_TYPE_深度、宽度、高度、fps);
_senseManager->Init();
PXCCaptureManager*captureManager=_senseManager->QueryCaptureManager();
if(captureManager==nullptr)
返回CameraInitializationResult(false,“未能创建CaptureManager”);
_设备=captureManager->QueryDevice();
如果(_device==nullptr)
返回CameraInInitializationResult(false,“未能创建设备”);
返回CameraInInitializationResult(true,“初始化成功”);
}
bool RealSenseCamera::IsReady()
{
return\u session!=nullptr&&u device!=nullptr&&u senseManager!=nullptr&&u senseManager->IsConnected();
}
int RealSenseCamera::GetFrameSize()
{
返回宽度*高度;
}
SetSensorConfiguration结果RealSenseCamera::SetSensorConfiguration(pxcBool自动曝光、pxcBool裁剪、pxcI32增益、pxcI32激光功率、PXCCapture::设备::IVCamAccurance精度)
{
如果(_device==nullptr)
返回SetSensorConfiguration结果(false,“找不到设备”);
_设备->设置DSLeftrightAutoExposure(自动曝光);
_设备->设置DSLeftrightCropping(裁剪);
_设备->设置DSLEFTRIGHTGAIN(增益);
_设备->设置激光功率(激光功率);
_设备->设置凸轮精度(精度);
返回SetSensorConfiguration结果(true,“新配置列表集”);
}
std::vector RealSenseCamera::QueryVertices()
{
向量顶点;
if(_senseManager->AcquireFrame(true)>=pxcStatus::PXC_STATUS_NO_ERROR){
PXCCapture::Sample*_Sample=_senseManager->QuerySample();
PXCImage*深度图像=_样本->深度;
顶点。调整大小(_宽度*_高度);
_投影=_设备->创建投影();
_投影->查询属性(深度图像和顶点[0]);
}
_传感器管理器->释放框架();
//康维特朗·莱德尔·比希尔·诺蒂格
返回转换(顶点);
}
//带für Punktdaten angelegt的Neuer向量
std::vector RealSenseCamera::convert(std::vector源)
{
int size=GetFrameSize();
std::矢量目标(大小);
对于(int i=0;i释放();
如果(_senseManager!=nullptr)
{
_传感器管理器->关闭();
_传感器管理器->释放();
}
if(_session!=nullptr)
_会话->发布();
}
有人看到问题了吗?为什么您认为这里有内存泄漏?您已经做了哪些调查,取得了哪些结果?我使用了VisualStudio的调试器,该调试器随时间显示了我的processmemory。2分钟后,我得到了超过10gb的泄漏。我想这可能是顶点向量中未被删除的旧pointerdata。(对不起,我的英语不好)如前所述,从
查询权限
接收向量的代码需要删除其元素。我会考虑使用“智能”指针。如果你的代码>矢量< /代码>拥有<代码> iPoxT3D *<代码>使用而不是原始指针。它将自动删除托管对象。为什么您认为这里有内存泄漏?您已经做了哪些调查,取得了哪些结果?我使用了VisualStudio的调试器,该调试器随时间显示了我的processmemory。2分钟后,我得到了超过10gb的泄漏。我想这可能是顶点向量中未被删除的旧pointerdata。(对不起,我的英语不好)如前所述,从查询权限
接收向量的代码需要删除其元素。我会考虑使用“智能”指针。如果你的代码>矢量< /代码>拥有<代码> iPoxT3D *<代码>使用而不是原始指针。它将自动删除托管对象。