将RAII应用于单个(成员)函数的范围之外

时间:2013-10-27 11:05:04

标签: c++ raii

我有一个单独的“经理”对象,它在流程开始时实例化,并在流程期间(有效地)生效。

此对象在其生命周期内创建多个临时任务(本身就是对象),使用“new”,然后使用“delete”销毁它们。这两个操作在两个不同的函数中执行 - 一个函数由外部对象调用以执行特定任务,另一个函数是在任务完成时调用的回调,因此任务对象随后被销毁。

由于任务对象不是在“临时”范围内创建/销毁的(例如单个成员函数),我是否在这个实例中浪费时间尝试应用RAII?或者我应该使用一种机制来解决这个问题吗?

此致 理查德。

2 个答案:

答案 0 :(得分:3)

您可以使用智能指针(例如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.
    }

答案 1 :(得分:0)

指向子任务的指针存储在第一个创建和第二个销毁函数之间。

将指针更改为unique_ptr,它将反映它拥有资源生命周期的事实。使用类型记录所有权,防止资源处理重复,并使代码更安全。

更先进的技术是完全用RAII替换'返回资源'阶段。将unique_ptr返回到crearion函数中的某个dqta或标记,该函数在reset时隐式调用销毁函数:将RAII推到一个抽象级别。这并不总是容易,欲望或有用,但仍值得考虑。