簡體   English   中英

將RAII應用於單個(成員)函數的范圍之外

[英]Applying RAII outside the scope of a single (member) function

我有一個單例“管理器”對象,它在進程啟動時被實例化,並在進程的持續時間內生效(有效)。

此對象在其生命周期中創建多個臨時任務(它們本身就是對象),使用“new”,然后使用“delete”銷毀它們。 這兩個操作在兩個不同的函數中執行 - 一個函數由外部對象調用以執行特定任務,另一個函數是在任務完成時調用的回調,因此任務對象隨后被銷毀。

由於任務對象不是在“臨時”范圍內創建/銷毀的事實(例如單個成員函數),我是否在這個實例中浪費時間嘗試應用RAII? 或者我應該使用一種機制來解決這個問題?

問候,理查德。

您可以使用智能指針(例如shared_ptr)。 單例應該包含指向這些任務的指針容器(例如地圖),並在完成時將其從向量中移除。

例如(不編譯,僅用於說明):

class MySingleton
{
    typedef std::shared_ptr<Task> TaskPtr;
    std::map<int, TaskPtr> m_tasks;

    StartTask()
    {
        TaskPtr task = std::make_shared<Task>();
        m_tasks[index] = task;
        ...
    }

    OnTaskEnd()
    {
        TaskPtr task = m_tasks[index];
        m_tasks.remove(index);
        taskCompletedHandler(task);

        // Unless taskCompletedHandler copies task, it will be destroyed when this leaves scope.
    }

您指向子任務的指針存儲在第一個創建和第二個銷毀函數之間的某個位置。

將該指針更改為unique_ptr ,它將反映它擁有資源生命周期的事實。 使用類型記錄所有權,防止資源處理重復,並使代碼更安全。

更先進的技術是完全用RAII替換“返回資源”階段。 unique_ptr返回到crearion函數中的某個dqta或標記,該函數在reset時隱式調用銷毀函數:將RAII提升到一個抽象級別。 這並不總是容易,欲望或有用,但仍然值得考慮。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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