Browse Source

Fix(UTask):修正了因为万能转发导致构造任务时保存的是引用(左值或者右值)的现象。原代码会导致保存引用,使得局部变量生命周期延长,而此时假设传入的可执行对象是一个仿函数且执行该类会访问类内部堆资源,则当离开作用域时类析构函数被调用,堆资源很可能在此被删除。此时异步线程再执行该局部变量的引用,会导致访问已被释放的资源,导致段错误。

HanYa 2 years ago
committed by GitHub
parent
commit
ab7012a7bf
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 4 additions and 3 deletions
  1. +4
    -3
      src/UtilsCtrl/ThreadPool/Task/UTask.h

+ 4
- 3
src/UtilsCtrl/ThreadPool/Task/UTask.h View File

@ -11,6 +11,7 @@
#include <vector> #include <vector>
#include <memory> #include <memory>
#include <type_traits>
#include "../UThreadObject.h" #include "../UThreadObject.h"
@ -23,10 +24,10 @@ class UTask : public UThreadObject {
virtual ~taskBased() = default; virtual ~taskBased() = default;
}; };
template<typename F>
template<typename F, typename T = typename std::decay<F>::type>
struct taskDerided : taskBased { struct taskDerided : taskBased {
F func_;
explicit taskDerided(F&& func) : func_(std::move(func)) {}
T func_;
explicit taskDerided(F&& func) : func_(std::forward<F>(func)) {}
CVoid call() override { func_(); } CVoid call() override { func_(); }
}; };

Loading…
Cancel
Save