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

时间:2015-03-26 14:54:29

标签: c++ pointers

我对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>

如您所见,我已将指针放在Header文件中,该文件会生成访问冲突写入位置和此行的地址

m_Airframe = new AC_Airframe_A330();

如果我对Header行进行注释,并取消注释Initialize函数中的行,则可以正常工作。为什么是这样?我希望m_Airframe对象可用于Initialize函数之外的其他内容。

我做错了什么?

2 个答案:

答案 0 :(得分:3)

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

AC_App * m_App;

因此,当调用成员函数Initialize

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

它尝试以无效地址

访问其数据成员
m_Airframe = new AC_Airframe_A330();

和错误&#34;访问违规&#34;发行。

您必须分配(或定义)此指针将引用的对象。

答案 1 :(得分:1)

在使用m_App的任何引用之前,您必须使用new

进行分配
m_App = new AC_App();