C++ UCRTBASE.dll:访问冲突

C++ UCRTBASE.dll:访问冲突,c++,runtime,C++,Runtime,我正在编写一个扩展(编译为动态库),我得到了扩展错误。不幸的是,我必须自己绘制整个GUI,不幸的是,在相当原始的GDI/WinAPI中。 这是我崩溃的代码: Slider::Slider(const char* objectId, int height, POINT topLeft, int visibleElements, int totalElements, int elementHeight, EuroScopePlugIn::CRadarScreen* rs) {

我正在编写一个扩展(编译为动态库),我得到了扩展错误。不幸的是,我必须自己绘制整个GUI,不幸的是,在相当原始的GDI/WinAPI中。 这是我崩溃的代码:


    Slider::Slider(const char* objectId, int height, POINT topLeft, int visibleElements, int totalElements, int elementHeight, EuroScopePlugIn::CRadarScreen* rs)
    {
        // Member variable initailization
        m_ObjectId = objectId;
        m_Height = height;
        m_TopLeft = topLeft;
        m_VisibleElements = visibleElements;
        m_ElementHeight = elementHeight;
        m_TotalElements = totalElements;
        m_Width = 10;
        m_pRS = rs;
        m_CurrentFirstElement = 0;
        m_CurrentLastElement = m_CurrentFirstElement + visibleElements;
    }

    SliderGrip::SliderGrip(Slider* sliderObject) : Slider(m_ObjectId.c_str(), m_Height, m_TopLeft, m_VisibleElements, m_TotalElements, m_ElementHeight, m_pRS)
    {
        // Base class member variable initialization
        {
            m_ObjectId = sliderObject->m_ObjectId;
            m_Height = sliderObject->m_Height;
            m_TopLeft = sliderObject->m_TopLeft;
            m_VisibleElements = sliderObject->m_VisibleElements;
            m_ElementHeight = sliderObject->m_ElementHeight;
            m_TotalElements = sliderObject->m_TotalElements;
            m_Width = sliderObject->m_Width;
            m_pRS = sliderObject->m_pRS;
            m_CurrentFirstElement = sliderObject->m_CurrentFirstElement;
            m_CurrentLastElement = sliderObject->m_CurrentLastElement;
        }
        m_GripHeight = (m_VisibleElements / m_TotalElements) * m_ElementHeight;
        m_GripTopLeft = (CPoint)(m_TopLeft.x, m_TopLeft.y + 10 + (m_CurrentFirstElement * m_ElementHeight));
    }

    void SliderGrip::RenderGrip(CDC* dc)
    {
        // localObjectId
        std::string localObjectId = "Grip";
        // Save DC for later
        int sDC = dc->SaveDC();

        // Create CRectangle
        CRect CRectangle(m_GripTopLeft.x, m_GripTopLeft.y, m_GripTopLeft.x + m_Width, m_GripTopLeft.y + m_GripHeight);

        // Grip Color
        COLORREF m_GripColor = RGB(0, 0, 0);

        // Fill CRectangle with CBrush
        CBrush RectangleFill(m_GripColor);
        dc->FillRect(&CRectangle, &RectangleFill);

        
        m_pRS->AddScreenObject(CELEMENTS::SCROLLBAR_GRIP, localObjectId.c_str(), CRectangle, 1, "");
        // Restore DC
        dc->RestoreDC(sDC);
        
        // Cleaning
        DeleteObject(RectangleFill);
    }

    SliderTrack::SliderTrack(Slider* sliderObject) : Slider(m_ObjectId.c_str(), m_Height, m_TopLeft, m_VisibleElements, m_TotalElements, m_ElementHeight, m_pRS)
    {
        // Base class member variable initialization
        {
            m_ObjectId = sliderObject->m_ObjectId;
            m_Height = sliderObject->m_Height;
            m_TopLeft = sliderObject->m_TopLeft;
            m_VisibleElements = sliderObject->m_VisibleElements;
            m_ElementHeight = sliderObject->m_ElementHeight;
            m_TotalElements = sliderObject->m_TotalElements;
            m_Width = sliderObject->m_Width;
            m_pRS = sliderObject->m_pRS;
            m_CurrentFirstElement = sliderObject->m_CurrentFirstElement;
            m_CurrentLastElement = sliderObject->m_CurrentLastElement;
        }

        m_TrackHeight = m_VisibleElements * m_ElementHeight;
        m_TrackTopLeft = (CPoint)(m_TopLeft.x, m_TopLeft.y + 10);
    }

    void SliderTrack::RenderTrack(CDC* dc)
    {
        // Save DC for later
        int sDC = dc->SaveDC();

        // CRectangle
        CRect CRectangle(m_TrackTopLeft.x, m_TrackTopLeft.y, m_TrackTopLeft.x + m_Width, m_TrackTopLeft.y + m_TrackHeight);

        // Color
        COLORREF m_TrackColor = RGB(200, 200, 200);

        // Fill CRectangle with CBrush
        CBrush RectangleFill(m_TrackColor);
        dc->FillRect(&CRectangle, &RectangleFill);

        // Restore DC
        dc->RestoreDC(sDC);

        // Cleaning
        DeleteObject(RectangleFill);
    }

    SliderButton::SliderButton() : Slider(m_ObjectId.c_str(), m_Height, m_TopLeft, m_VisibleElements, m_TotalElements, m_ElementHeight, m_pRS)
    {

    }
[……]

稍后,通过以下方式从主应用程序调用代码:

CallingFunction()
{
 testScroll = new CInterface::Scrollbar("testScroll", this, xyz, 50, 10, 50, 5);
}
~CallingFunction()
{
 delete testScroll;
}

到目前为止,代码不会崩溃,但一旦我调用渲染函数:

OnRender(HDC hDC)
{
 CDC    dc;
 dc.Attach(hDC);
 testScroll->Render(&dc);
 dc.Detach();
 dc.DeleteDC();
}
应用程序在启动时崩溃,出现给定代码错误:

EuroScope.exe中0x78F6FF5C(ucrtbased.dll)处引发异常:0xC0000005:访问冲突读取位置0xCDCDCD


我不知道是什么原因,有什么想法吗?我大致确定它可能与某些指针和/或传递的
const char*
有关。当我试图尽可能地将
const char*
替换为
std::string
时,我遇到了一个类似的错误,但与
vcruntime140.dll
有关。

0xcdcdcdcdcd
表示未初始化的堆内存。您可能有一个未初始化的指针。使用调试器找出哪个指针。相关:调试器在哪里告诉您发生异常?您可能需要遍历调用堆栈才能走出库并进入代码。在Visual Studio社区的“调试”工具栏上有一个“堆栈框架”组合框,允许您像前面提到的注释一样切换调用堆栈。@1201程序很遗憾,调用堆栈没有给我任何建议。这是我在Render上得到的结果,看起来您需要配置Visual Studio以从Microsoft symbol服务器下载.pdb文件。您可以在菜单->选项->调试->符号中进行配置。
OnRender(HDC hDC)
{
 CDC    dc;
 dc.Attach(hDC);
 testScroll->Render(&dc);
 dc.Detach();
 dc.DeleteDC();
}