【发布时间】:2012-06-22 09:58:09
【问题描述】:
我最近在 Visual C++ 2010 中编写了一个非常简单的记录器类,但是我遇到了一个问题。每次运行程序,都会出现调试断言失败。
Expression: _CrtIsValidHeapPointer(pUserData)
这就是我的班级的样子(基本上它只是从这里的答案C++ Singleton design pattern 中稍作修改):
class Logger
{
public:
// Returns static instance of Logger.
static Logger& getInstance()
{
static Logger logger; // This is where the assertion raises.
return logger;
}
void logError(std::string errorText);
// Destructor.
~Logger();
private:
std::ofstream logFileStream;
// The constructor is private to prevent class instantiating.
Logger();
// The copy constructor and '=' operator need to be disabled.
Logger(Logger const&) { };
Logger& operator=(Logger other) { };
};
而构造函数是:
Logger::Logger()
: logFileStream(Globals::logFileName, std::ios_base::trunc)
{
// (Tries to open the file specified in Globals for (re)writing.)
}
我发现我可以通过某种方式使用静态变量或方法来解决它,但我不明白这段代码有什么问题。有谁知道问题出在哪里?
编辑:仅供参考,调用此代码时会引发故障(第一次):
Logger::getInstance().logError("hello");
编辑2:这是logFileName在Globals中的定义:
static const std::string logFileName = "errorLog.log";
【问题讨论】:
-
getInstance()是否正确执行?你到logError()了吗? -
正确的实例化应该发生在静态方法中 - 我已经在代码中添加了注释。
-
断言似乎发生在构造函数中。那是您没有显示的代码...
-
这似乎没问题(只要它在 Logger 构造函数之前被初始化)——
getInstance()是否有任何机会从静态块中调用(例如,在计算静态变量的值时? ) -
全局变量之间存在一些依赖关系(例如 logger 单例和
std::string logFileName。您确定它们以正确的顺序实例化吗?(请记住,如果每个变量位于不同的编译单元中,则顺序C++ 中没有定义构造方法。)
标签: visual-c++ singleton c++-cli assert