在单个(成员)函数的范围之外应用 RAII
Applying RAII outside the scope of a single (member) function
我有一个单例"管理器"对象,它在进程启动时实例化,并在进程期间(有效)存在。
此对象在其生命周期内使用"new"创建多个临时任务(它们本身就是对象),然后使用"删除"销毁它们。 这两个操作在两个不同的函数中执行 - 一个函数由外部对象调用以执行特定任务,另一个函数是在任务完成时调用的回调,因此任务对象随后被销毁。
由于任务对象不是在"临时"范围(例如单个成员函数)中创建/销毁的,因此我是否浪费时间尝试在这种情况下应用 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完全取代"返回资源"阶段。 从 crearion 函数返回对某个 dqta 或令牌的unique_ptr
,该函数在reset
时隐式调用销毁函数:将 RAII 推上一个抽象级别。 Rhis并不总是容易,可取或有用,但仍然值得考虑。
相关文章:
- 为什么在全局范围内使用"extern int a"似乎不行?
- 尝试通过多个向量访问变量时,向量下标超出范围
- 错误:未在此范围内声明'reverse'
- 试图在visual studio上用C++创建一个桌面应用程序
- 正在将指针转换为范围
- 递归应用 C++20 范围适配器会导致编译时无限循环
- 当按下任何qpushbutton时,应用程序范围较高
- 将自适应阈值应用于范围函数 opencv c++
- C++:将参数应用于函数范围
- 关闭Qt控制台应用程序会终止exec()调用中的进程,并且无法从main()扩展到范围
- 常量的应用范围?
- 在 ipv6 链接范围单播 udp 客户端-服务器中应用 boost::asio::ip::udp,有时有效,但有时无效
- 应用于单词数组的随机数范围
- 在单个(成员)函数的范围之外应用 RAII
- 错误:“应用”未在此范围内声明
- 标准算法 any_of()、all_of() 和 none_of() 应用于空范围
- 整数宇宙映射数组到固定范围的应用与实现
- 应用范围解析运算符会导致编译器阻塞
- 当应用于命名空间范围的类时,静态是什么意思?
- 当C++试图访问向量的元素(在范围内)时,Qt Quick Windows应用程序崩溃