[英]How to return a reference to a new object without memory leaks? c++
我正在為調試系統編寫宏
我有一個重載的鏈運算符<<(MessageAssembler& target,message_type msg)
( message_type
)是該運算符的模板參數
它將msg
添加到target
的QTextStream
類型的內部變量中。
+=(MessageAssembler& result)
的運算符+=(MessageAssembler& result)
將result
的流傳MessageAssembler
函數,該函數根據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
錯誤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 ++ 智能指針功能 。
最直接的實現似乎是創建一個std::unique_ptr<MessageAssembler>
實例並返回該實例。 調用客戶端將獲得對創建實例的所有權,並且一旦引用超出范圍,它將自動被刪除。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.