1

我有一个单例“管理器”对象,它在流程启动时被实例化并在流程期间(有效地)存在。

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

由于任务对象没有在“临时”范围内创建/销毁(例如单个成员函数),我是否在浪费时间尝试在这种情况下应用 RAII?或者是否有我应该使用的机制来处理这个问题?

问候,理查德。

4

2 回答 2

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.
    }
于 2013-10-27T11:24:43.873 回答
0

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

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

一种更先进的技术是用 RAII 完全替换“返回资源”阶段。从 crearion 函数中将a 返回unique_ptr到某个 dqta 或令牌,该函数在以下情况下隐式调用破坏函数reset:将 RAII 提升到抽象级别。Rhis 并不总是简单、理想或有用的,但仍然值得考虑。

于 2013-10-27T11:56:38.683 回答