我有一个单独的“经理”对象,它在流程开始时实例化,并在流程期间(有效地)生效。
此对象在其生命周期内创建多个临时任务(本身就是对象),使用“new”,然后使用“delete”销毁它们。这两个操作在两个不同的函数中执行 - 一个函数由外部对象调用以执行特定任务,另一个函数是在任务完成时调用的回调,因此任务对象随后被销毁。
由于任务对象不是在“临时”范围内创建/销毁的(例如单个成员函数),我是否在这个实例中浪费时间尝试应用RAII?或者我应该使用一种机制来解决这个问题吗?
此致 理查德。
答案 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推到一个抽象级别。这并不总是容易,欲望或有用,但仍值得考虑。