程序运行正常,但内存验证程序报告错误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;
答案 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()函数访问实例,无论我需要它。