2014-11-15 16 views
0

我正在写宏用于调试系统如何将引用返回给没有内存泄漏的新对象? C++

我有一个重载链状操作者<<(MessageAssembler& target,message_type msg)message_type)是用于操作者

它增加QTextStream类型的msgtarget的内变量的模板的参数。

MessageAssembler的运营商+=(MessageAssembler& result)result的流传递到基于result的参数处理它的功能。

我想要做这样的事情:

#define FATAL(facility) NLog::assembler+=MessageAssembler(Log::fatal_sev,facility)<< __FILE__<<":"<<__LINE__ 

NLog::assemblerMessageAssembler类型的静态变量)

应该确定输出的设备,允许用户通过添加自己的消息输出使用

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第三方库解决。一般的解决方案是由πάνταῥεῖ提出的。

回答

3

最简洁的答案是:

使用原始指针它不这样做!改为使用C++ smart pointer features

最直接的实现似乎是,创建一个std::unique_ptr<MessageAssembler>实例并返回此实例。调用客户端将获得所创建实例的所有权,并且只要引用超出范围,它就会自动删除。

+0

有没有办法做到这一点'unique_ptr'?因为Ubuntu中的QtCreator在'std'命名空间中产生'error:'unique_ptr'并没有命名为静态类型std :: unique_ptr '。我不确定是否说服他人更改此问题的编译器设置,并且可以更改设置。 – user2136963

+2

@ user2136963 Qt通常适用于指定'-std = C++ 11',尽管您并没有因为这些考虑而限制您的问题。 –