【问题标题】:Object initialization differences in afxmem.cppafxmem.cpp 中的对象初始化差异
【发布时间】:2018-07-20 11:17:47
【问题描述】:

我在函数 z 中有一个对象,我正在从函数 x 和 y 访问它。问题是它是通过 afxmem.cpp(VS 11.0 文件)中的不同函数初始化的。

这是我的代码;

classA
{
public:
    ADesign *a_d;
};
void classA::functionZ()
{
    a_d = new ADesign;
}

//functionX and functionY both calls same function
void classB::functionX()
{
    ca.functionZ();
}
void classB::functionY()
{
    ca.functionZ();
}

//sample initializer for ADesign
ADesign::ADesign()
:doc_(0)
{
    version_number = 7.82f; 
    d_file = ""; 
    c_file = ""; 
    angle = ID_ANGLE_MER;
    machine_type = MACHINE_COMPRESS;
    //...etc
}

当它被初始化时,它会在 afxmem.cpp 中为函数 x 执行这些函数

void* PASCAL
CObject::operator new(size_t nSize, LPCSTR lpszFileName, int nLine)
{
    return ::operator new(nSize, _AFX_CLIENT_BLOCK, lpszFileName, nLine);
}

void* __cdecl operator new(size_t nSize, int nType, LPCSTR lpszFileName, int nLine)
{
#ifdef _AFX_NO_DEBUG_CRT
    UNUSED_ALWAYS(nType);
    UNUSED_ALWAYS(lpszFileName);
    UNUSED_ALWAYS(nLine);
    return ::operator new(nSize);
#else
    void* pResult;
#ifdef _AFXDLL
    _PNH pfnNewHandler = _pfnUninitialized;
#endif
    for (;;)
    {
        pResult = _malloc_dbg(nSize, nType, lpszFileName, nLine);
        if (pResult != NULL)
            return pResult;

#ifdef _AFXDLL
        if (pfnNewHandler == _pfnUninitialized)
        {
            AFX_MODULE_THREAD_STATE* pState = AfxGetModuleThreadState();
            pfnNewHandler = pState->m_pfnNewHandler;
        }
        if (pfnNewHandler == NULL || (*pfnNewHandler)(nSize) == 0)
            break;
#else
        if (_afxNewHandler == NULL || (*_afxNewHandler)(nSize) == 0)
            break;
#endif
    }
    return pResult;
#endif
}

而这个函数在afxmem.cpp中为函数y;

void* __cdecl operator new(size_t nSize)
{
    void* pResult;
#ifdef _AFXDLL
    _PNH pfnNewHandler = _pfnUninitialized;
#endif
    for (;;)
    {
#if !defined(_AFX_NO_DEBUG_CRT) && defined(_DEBUG)
        pResult = _malloc_dbg(nSize, _NORMAL_BLOCK, NULL, 0);
#else
        pResult = malloc(nSize);
#endif
        if (pResult != NULL)
            return pResult;

#ifdef _AFXDLL
        if (pfnNewHandler == _pfnUninitialized)
        {
            AFX_MODULE_THREAD_STATE* pState = AfxGetModuleThreadState();
            pfnNewHandler = pState->m_pfnNewHandler;
        }
        if (pfnNewHandler == NULL || (*pfnNewHandler)(nSize) == 0)
            break;
#else
        if (_afxNewHandler == NULL || (*_afxNewHandler)(nSize) == 0)
            break;
#endif
    }
    return pResult;
}

当它通过函数 y 时,它没有被正确初始化。我正在通过函数 y 的命令行访问程序。

对于同一个对象以两种不同的方式进行初始化是否有原因?

谢谢。

【问题讨论】:

  • 我认为你应该创建一个minimal reproducible example 并发布。
  • @Jabberwocky,看起来复杂的代码实际上来自 Microsoft Foundation Classes C++ 库文件。如果有助于清晰,我可以删除它并添加行号。
  • 无需添加行号,但您的代码(或至少相关部分)会很有趣
  • 您需要指定未正确初始化的内容。如果没有minimal reproducible example,则无法回答问题。
  • 我修改了代码示例,希望对您有所帮助

标签: c++ visual-studio-2012 mfc


【解决方案1】:

在您的 .cpp 文件的开头,您可能有也可能没有这一行:

#define new DEBUG_NEW

如果存在此行,则new 将最终调用此函数:

void* __cdecl operator new(size_t nSize, int nType, LPCSTR lpszFileName, int nLine)

如果它不存在,那么new 将最终调用这个函数:

void* __cdecl operator new(size_t nSize)

这是内部 MFC 调试的东西。

但这并不能解释为什么某些东西没有正确初始化。您需要详细说明您的问题,这还不够清楚。

【讨论】:

  • 你是对的。我通过调试过程访问函数 x ,它表明 a_d 已初始化。虽然由于函数 y 是通过命令提示符访问的,但我后来附加了调试器以在其中命中断点。在那里我可以看到 a_d 中的某些变量没有初始化(枚举等),这就是产生混淆的地方。
猜你喜欢
  • 2015-02-15
  • 2023-01-10
  • 2022-01-09
  • 2013-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多