从继承的类访问时,成员对象地址似乎已更改

时间:2018-12-05 21:06:19

标签: c++

我的代码是Visual Studio 2017下的C ++。它在VS2013下正常工作,但是升级到VS2017后在32位版本中失败(但仍在64位版本中工作)。

class DerivedFluentUI: public SFLFluentUI
{
    friend CMainFrame;

protected:
    virtual BOOL ImplCaptionBar (CWnd* pParentWnd);
    virtual BOOL ImplRibbonBar (CWnd* pParentWnd, BOOL bCreateAppButton = TRUE, BOOL bCreateBackstageFileTab = FALSE) {return m_wndRibbonBar.Create(pParentWnd);}
};

已删除很多代码(长200行)的基类是:

class SFLFluentUI
{
protected:
    virtual BOOL ImplRibbonBar(CWnd* pParentWnd, BOOL bCreateAppButton = TRUE, BOOL bCreateBackstageFileTab = FALSE);
    virtual BOOL ImplCaptionBar(CWnd* pParentWnd);

    SFLRibbonBarEx              m_wndRibbonBar;
    SFLCaptionBarEx             m_wndCaptionBar;
};

在DerivedFluentUI :: ImplCaptionBar中,我打电话(除其他外):

m_wndCaptionBar.Create (...)

以32位版本崩溃。

当我在调试器中进入对m_wndCaptionBar.Create的调用时,我发现“ this”指针不等于m_wndCaptionBar的地址(从ImplCaptionBar看)。上次我检查时,它们分别是0x10d46538和0x10d46530,所以相隔8个字节。

如果我进入DerivedFluentUI::ImplRibbonBar()中与m_wndRibbonBar.Create的类似调用,则“ this”指针与m_wndRibbonBar的地址相同,并且成功执行。

陌生人仍然,如果我在64位版本中执行此操作,那么这一切都按预期工作,并且对m_wndCaptionBar.Create的调用中的“ this”指针等于&m_wndCaptionBar(从DerivedFluentUI::ImplCaptionBar)。

如果我从__super::ImplCaptionBar (...)调用m_wndCaptionBar.Create(本身称为DerivedFluentUI::ImplCaptionBar),那么即使在32位版本中,它也可以正常工作。

我显然误会了一些东西,因为我不知道为什么会这样。

帮助?!

根据请求进行编辑: DerivedFluentUI没有构造函数或析构函数,只是覆盖了这两个虚函数。

SFLFluentUI基类的构造函数:

SFLFluentUI::SFLFluentUI(void)
{
    m_pMainPanel                    = NULL;
    m_bLoadedFromResource           = FALSE;
    m_bRibbonInitialized            = FALSE;
    m_bFreqCmdPanels                = FALSE;
    m_bFreqCmdPanelsInitialized     = FALSE;
    m_bIsUsingMainApplicationButton = FALSE;
    m_bIsBackstageFileTabCreated    = FALSE;
    m_pBackstagePropertySheet       = NULL;
    m_bIsBackstageFileWindowVisible = FALSE;
    m_bRibbonMinimizedBeforeBackstage = FALSE;
    m_bHasSysMenu                   = FALSE;

    if (NULL == g_FluentUI)
    {
        g_FluentUI = this;
    }
}

**编辑12/6/2018

这使用了RogueWave的Stingray库。我能够在他们的样本中重现该样本,这与我们正在谈论的大型UI库的样本一样少。将其发布在这里没有多大意义,因为您需要他们的库来运行它,但这确实意味着我可以参与RogueWave技术支持。

当他们/我们弄清楚某些东西时,我会更新情况。

**编辑2018年12月7日

崩溃似乎与操作系统有关。

Windows 7:不会崩溃(在2台计算机上测试)

Windows 10:崩溃(在2台计算机上测试,第3个待处理) Windows Server 2012:崩溃(在1台计算机上测试)

我会进行更新,以防万一有人给我一些晦涩的环境,或者可能是我可能会提出的吟或咒语。在我看来,高呼似乎是一门好科学(尽管我必须承认对我的机器大喊并不能解决问题……)。

**编辑4/3/2019

我从来没有想过。最终放弃并重新设计了一些东西以避免使用DerivedFluentUI,而是修改了Stingray库中的代码以执行我想要的操作。我对此不满意,但是...

如果有人对此有所了解,请更新此案例。我很想知道这个问题。

0 个答案:

没有答案