簡體   English   中英

如何在沒有內存泄漏的情況下返回對新對象的引用? C ++

[英]How to return a reference to a new object without memory leaks? c++

我正在為調試系統編寫宏

我有一個重載的鏈運算符<<(MessageAssembler& target,message_type msg)message_type )是該運算符的模板參數

它將msg添加到targetQTextStream類型的內部變量中。

+=(MessageAssembler& result)的運算符+=(MessageAssembler& result)result的流傳MessageAssembler函數,該函數根據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錯誤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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM