我正在写宏用于调试系统如何将引用返回给没有内存泄漏的新对象? C++
我有一个重载链状操作者<<(MessageAssembler& target,message_type msg)
(message_type
)是用于操作者
它增加QTextStream
类型的msg
到target
的内变量的模板的参数。
MessageAssembler
的运营商+=(MessageAssembler& result)
将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第三方库解决。一般的解决方案是由πάνταῥεῖ提出的。
有没有办法做到这一点'unique_ptr'?因为Ubuntu中的QtCreator在'std'命名空间中产生'error:'unique_ptr'并没有命名为静态类型std :: unique_ptr'。我不确定是否说服他人更改此问题的编译器设置,并且可以更改设置。 –
user2136963
@ user2136963 Qt通常适用于指定'-std = C++ 11',尽管您并没有因为这些考虑而限制您的问题。 –