分段错误试图使操作员过载<<
Segmentation fault trying to overload << operator
从C++开始,我写了一段简单的代码,它旨在用作(非常基本的)记录器。这主要是尝试重载运算符。
class Logger {
public:
Logger() : _has_logged_something(false) { };
template <typename T>
friend Logger& operator <<(Logger& logger, T const & value) {
logger._has_logged_something = true;
std::cerr << value;
return logger;
};
private:
bool _has_logged_something;
};
我需要记住何时已经在_has_logged_something
实例变量中加载了某些内容。但是这条线在运行时引起了非常有用的Segmentation fault (core dumped)
。一定是一个明显的错误,但我无法理解。
--
编辑
由于这似乎不是这段代码的问题,因此如何使用它来避免使用单例(可能不是有史以来最好的代码,但无论如何)。
#ifndef _BORDERS_COMMON_LOGGER_LOGGER_HH_INCLUDED
#define _BORDERS_COMMON_LOGGER_LOGGER_HH_INCLUDED
#include "common/log/logger.hh"
#include "common/log/event.hh"
namespace {
static borders::common::log::Logger* _global_logger = NULL;
}
namespace borders {
namespace common {
namespace log {
inline bool is_global_instance_initialized() {
return _global_logger != NULL;
};
inline Logger& get_global_instance() {
if (_global_logger == NULL) _global_logger = new Logger;
return *_global_logger;
};
} // namespace log
} // namespace common
} // namespace borders
#define LOG_INFO() (borders::common::log::get_global_instance())
#define LOG_START()
#define LOG_STOP()
if (borders::common::log::is_global_instance_initialized())
delete &borders::common::log::get_global_instance();
else
(void) 0;
#endif // _BORDERS_COMMON_LOGGER_LOGGER_HH_INCLUDED
鉴于我尝试使用以下命令运行它:
LOG_INFO() << "Foo" << "Bar"
再一次,当我注释掉我之前指出的行时,文本会写在控制台上。
好的,我知道了!
我认为。至少我有一个猜测
看,该行logger._has_logged_something = true
是唯一使用类logger
数据的行。所以我的猜测是该类无效
我的意思是你并没有真正创建那个类。由于某种原因,它并没有真正分配。
例如,如果您这样做了:
Logger *log; // see - I didn't put any value to it!
(*log)<<value; // this will do a segmentation fault or something
// ONLY if you have the line logger._has_logged_something = true
这只是一个例子。还有其他选项,例如:
struct blah{
blah(Logger &log):logger(log);
Logger &logger;
};
blah func(){
Logger log;
return blah(log);
}
...
blah b=func(); // b has an invalid logger in it, because it was destroyed after func
blah.logger << value ; // will do a segmentation fault too
编辑
刚刚看到您的编辑。所以这似乎是我的第一个例子。具体来说,我相信您在登录之前确实LOG_STOP()
。
编辑 2
您的代码中存在固有问题。 LOG_STOP
删除记录器,但不会将其重置为 NULL
。因此,如果您想在此之后重新启动日志记录,则不会重新创建记录器(因为get_global_instance
在决定创建记录器之前检查记录器是否NULL
)。
尝试更改LOG_STOP
以将_global_logger
设置为 NULL,看看是否可以修复它。
相关文章:
- 为什么我的作业操作员给出了损坏错误
- 操作员=在两个std :: chrono :: time_point引起错误之间
- 无操作员错误代码
- 在定义C2679和C2678错误代码的地方未找到二进制操作员
- 使用流操作员构建错误
- 错误:“操作员^”无匹配
- 使用多个操作员与操作员重载会产生奇怪的错误
- 使用%操作员时双重错误
- 错误:“ const char*”类型的操作数和“ const char [7]”类型为二进制“操作员 ”
- 新的操作员帮助,类型分配器和其他错误
- 学习OOP:超载 OR =操作员错误
- 为什么我无法使错误操作员()无法超载
- 通过使用新操作员创建对象会导致未解决的外部符号错误C FTGL
- 超载流提取操作员错误
- 与操作员错误不匹配
- 过载<<操作员错误
- 捕获块使我无法与操作员错误相匹配
- Visual Studio中的操作员错误(错误C2784)
- OpenCV:操作员"+"错误;加法
- 井字 - 操作员*错误不匹配