我正在为调试系统编写宏
我有一个重载的链式运算符<<(MessageAssembler& target,message_type msg)
(message_type
)是操作员的模板参数
它将msg
添加到target
类型为QTextStream
的内部变量中。+=(MessageAssembler& result)
的运算符MessageAssembler
将result
的流传递给函数,该函数根据result
的参数对其进行处理。
我想做这样的事情:
#define FATAL(facility) NLog::assembler+=MessageAssembler(Log::fatal_sev,facility)<< __FILE__<<":"<<__LINE__
(
NLog::assembler
是类型为MessageAssembler
的静态变量)它应该确定输出的功能,允许用户使用以下命令添加自己的消息以输出
FATAL(some_facility)<<"custom message"<<ObjectWhichCanBePassedToQTextStream()<<AnotherObject();
但是
MessageAssembler(Log::fatal_sev,facility)
会产生a reference to temporary
错误。这个
MessageAssembler& MessageAssembler::get_instance(Log::Severity _msg_sev,Log::Facility _msg_fac)
{
MessageAssembler tmp(_msg_sev,_msg_fac);
return tmp;
}
将返回对不存在对象的引用;
这个
MessageAssembler& MessageAssembler::get_instance(Log::Severity _msg_sev,Log::Facility _msg_fac)
{
return new MessageAssembler tmp(_msg_sev,_msg_fac);
}
会导致内存泄漏
这个
QScopedPointer<MessageAssembler> MessageAssembler::get_instance(Log::Severity _msg_sev,Log::Facility _msg_fac)
{
return QScopedPointer<MessageAssembler>(new MessageAssembler tmp(_msg_sev,_msg_fac));
}
将不起作用,因为
QScopedPointer
不能按值传递我不确定存储第二个静态变量
MessageAssembler chain_starter;
是否是线程安全的。我不仅有
FATAL
宏,所以该程序不会在调用后总是终止。如何返回对新
MessageAssembler
的引用?编辑:我的问题通过安装用于智能指针的第三方库(即yasper)解决。通用解决方案由πάνταῥεῖ提出。
最佳答案
最简洁的答案是:
不要使用原始指针!请改用c ++ smart pointer features。
最直接的实现似乎是创建一个std::unique_ptr<MessageAssembler>
实例并返回该实例。调用客户端将获得对创建实例的所有权,并且一旦引用超出范围,它将自动被删除。