代码之家  ›  专栏  ›  技术社区  ›  Madz

afxmem.cpp中的对象初始化差异

  •  0
  • Madz  · 技术社区  · 6 年前

    我在函数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
    }
    

    以及函数y在afxmem.cpp中的这个函数;

    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的命令行访问程序。

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

    谢谢。

    1 回复  |  直到 6 年前
        1
  •  2
  •   Jabberwocky    6 年前

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

    #define new DEBUG_NEW
    

    如果有这条线,那么 new 最终将调用此函数:

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

    如果它不存在,那么 新的 最终将调用此函数:

    void* __cdecl operator new(size_t nSize)
    

    这是内部的MFC调试工具。

    但这不能解释为什么 未正确初始化 . 你需要详细说明你的问题,这还不够清楚。