C++ 填充向量导致的内存泄漏

C++ 填充向量导致的内存泄漏,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

我的内存泄漏是由函数转换引起的。 该函数用于将非常大的三维点数据矢量转换为另一个矢量 其他3D点数据的矢量

这是我的密码:

IPoint3D.h

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 *<代码>使用而不是原始指针。它将自动删除托管对象。