我正在为调试系统编写宏

我有一个重载的链式运算符<<(MessageAssembler& target,message_type msg)
message_type)是操作员的模板参数

它将msg添加到target类型为QTextStream的内部变量中。

+=(MessageAssembler& result)的运算符MessageAssemblerresult的流传递给函数,该函数根据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>实例并返回该实例。调用客户端将获得对创建实例的所有权,并且一旦引用超出范围,它将自动被删除。

07-24 12:42