类初始化问题

时间:2011-08-01 17:06:50

标签: c++

程序运行正常,但内存验证程序报告错误UNINITIALIZED READ在线CProfiles配置文件;

CProfiles外部的类CProfiles的“配置文件”定义是一种糟糕的编程习惯吗?

这是我的代码: 在profiles.cpp里面。

#include "profiles.h"

CProfiles profile;  // Here it reports the problem
KeyProfile* keyProfile=&profile;    // keyProfile is later used in other classes
//-------------------------------------------------------------

CProfiles::CProfiles():forceDialog(0)
{
      oldName="";
}

int CProfiles::Init()
{   
     _chdir(PROFILES_PATH);
}

CProfiles::~CProfiles()
{
}

里面的profiles.h

#define PROFILES_PATH           "Profiles"  
#include "KeyProfile.h"

class CProfiles: public KeyProfile
{

    public: 
       CProfiles();
       ~CProfiles();
       int Init();
       bool forceDialog;
       string oldName;
};

extern CProfiles profile; 

KeyProfile.h

    public:
   virtual UINT GetKeyUp()      { return DIK_UP; }
   virtual UINT GetKeyDown()    { return DIK_DOWN; }
   virtual UINT GetKeyLeft()    { return DIK_LEFT; }
   virtual UINT GetKeyRight()   { return DIK_RIGHT; }
   virtual UINT GetKeyAction()  { return DIK_RETURN; }
   virtual UINT GetKeyCancel()  { return DIK_RCONTROL; }
       virtual UINT GetKeyEsc() { return DIK_ESCAPE; }
   KeyProfile(void){};
   virtual ~KeyProfile(void){};
    };
    extern KeyProfile* keyProfile;

2 个答案:

答案 0 :(得分:0)

您正在使用的代码分析器抱怨,因为您已在CProfiles profiles;中实例化了自动对象extern关键字告诉编译器您将设置外部的对象将在其他位置创建,因此链接器将在稍后找到该符号,并使其全部工作。代码分析器让您知道您可能忘记初始化对象。

答案 1 :(得分:0)

更新:实际上我发现了一个问题。它是静态初始化命令fiasco。有关此问题的更多信息,例如:Constructors - How do I prevent the "static initialization order fiasco"?

以下是我的代码中的解决方案:

// in profiles.cpp

//CProfiles profile; // Insted this, I access the instance through the profile() function
CProfiles& profile()    
{
    static CProfiles* ans = new CProfiles();
    return *ans;
}
KeyProfile* keyProfile=profile();

我通过profile()函数访问实例,无论我需要它。