我正在为调试系统编写宏
我有一个重载的链式运算符 <<(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>
实例并返回这个。调用客户端将获得所创建实例的所有权,一旦该引用超出范围,它将自动删除。
关于c++ - 如何在没有内存泄漏的情况下返回对新对象的引用? C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26949513/