我想从 C++ POCO 库任务类中获取数据,但是在 runTask() 函数完成后,任何动态内存变量似乎都被处理掉了。在以下示例中,一旦 runTask() 完成,_series 将为空,因此 getSeries() 不返回任何内容。
#include <Poco/Task.h>
#include <Poco/TaskManager.h>
#include <iostream>
#include <vector>
class FibonacciTask: public Poco::Task
{
public:
FibonacciTask(int n): Task("FibonacciTask"), _n(n) {}
void runTask()
{
long long a = 0, b = 1;
_series.push_back(a);
_series.push_back(b);
for (int i = 2; i <= _n; i++) {
long long temp = a + b;
a = b;
b = temp;
_series.push_back(b);
if (isCancelled()) {
std::cout << "\nTask cancelled." << std::endl;
break;
}
}
}
const std::vector<long long>& getSeries() const { return _series; }
private:
int _n;
std::vector<long long> _series;
};
我尝试使用私有 std::vector 变量并通过 getter 访问它。
这是一个无法正常工作的例子:
> g++ -I/usr/local/include/Poco -o prog main.cpp -L/usr/local/lib -lPocoFoundation
> ./prog
0 1 1 2 3 5 8 13 21 34 55
0 139993720817872 1 2 3 5 8 13 21 34 55
0 139993720817872 1 2 3 5 8 13 21 34 55
#include <Poco/Task.h>
#include <Poco/TaskManager.h>
#include <iostream>
#include <vector>
#include <unistd.h>
class FibonacciTask: public Poco::Task
{
public:
FibonacciTask(int n): Task("FibonacciTask"), _n(n) {}
void runTask()
{
long long a = 0, b = 1;
_series.push_back(a);
_series.push_back(b);
for (int i = 2; i <= _n; i++) {
long long temp = a + b;
a = b;
b = temp;
_series.push_back(b);
if (isCancelled()) {
std::cout << "\nTask cancelled." << std::endl;
break;
}
}
for (const auto& num : _series) {
std::cout << num << " ";
}
std::cout << std::endl;
}
void printSeries(){
for (const auto& num : _series) {
std::cout << num << " ";
}
std::cout << std::endl;
}
private:
int _n;
std::vector<long long> _series;
};
int main()
{
Poco::TaskManager tm;
FibonacciTask *ft = new FibonacciTask(10);
tm.start(ft);
usleep(1000) ;
ft->printSeries() ;
usleep(1000) ;
tm.joinAll();
usleep(1000) ;
ft->printSeries() ;
usleep(1000) ;
return 0;
}
在Poco::TaskManager的文档中指出:
TaskManager 获取 Task 对象的所有权,并在它完成时将其删除。
因此,TaskManager 将在
joinAll
中对您的对象调用 delete,因此 ft
包括它的 _series
将不再有效。
查看
std::shared_ptr
,使任务成为共享对象或其中包含的系列。对于这个任务,我认为图书馆有自己的using TaskPtr = AutoPtr < Task >
,它实现了相同的引用计数想法。或者,在 main
中的任务之外创建系列向量,并将对它的引用存储在任务对象中(引用可以在构造函数中传递)。