在标头中声明指针会导致访问冲突

Declare Pointer in Header results in Access Violation

本文关键字:访问冲突 指针 声明      更新时间:2023-10-16

我对C++还很陌生,所以请耐心等待。在我的头文件中,我声明了以下类:

#include "AC_Airframe_A330.h"
class AC_App
{
public:
    AC_App();
    ~AC_App();
    HRESULT Initialize();
    AC_Airframe_A330 * m_Airframe;
};

在我的C++文件中,我使用以下代码来启动程序,并开始创建指针:

#include "AC_App.h"
AC_App * m_App;
int WINAPI WinMain( HINSTANCE, HINSTANCE, LPSTR, int )
{
    HeapSetInformation(NULL, HeapEnableTerminationOnCorruption, NULL, 0);
    if (SUCCEEDED(CoInitialize(NULL)))
    {
        {
            if (SUCCEEDED(m_App->Initialize()))
            {
                m_App->RunMessageLoop();
            }
        }
        CoUninitialize();
    }
    return 0;
}
HRESULT AC_App::Initialize()
{   
    //AC_Airframe_A330 * m_Airframe;
    m_Airframe = new AC_Airframe_A330();
    m_Airframe->Startup_State();
<snip>

正如你所看到的,我已经把指针放在头文件中,它生成了一个访问违规写入位置和这一行的地址

m_Airframe = new AC_Airframe_A330();

如果我在Initialize函数中注释掉Header行,并取消注释该行,它就可以工作了。为什么会这样?我希望m_Airframe对象可用于Initialize函数之外的其他对象。

我做错了什么?

指针m_App由空指针常量初始化。

AC_App * m_App;

因此,当成员函数Initialize被称为时

if (SUCCEEDED(m_App->Initialize()))

它试图访问其位于无效地址的数据成员

m_Airframe = new AC_Airframe_A330();

并发出错误"访问违规"。

您必须分配(或定义)一个将由该指针引用的对象。

在使用对m_App的任何引用之前,必须将其与new:一起分配

m_App = new AC_App();