是否有推荐的方法从 C++ POCO 任务中取回数据,分配给私有 std::vector 成员的数据已删除

问题描述 投票:0回答:1

我想从 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;
}
c++ poco-libraries
1个回答
0
投票

Poco::TaskManager的文档中指出:

TaskManager 获取 Task 对象的所有权,并在它完成时将其删除。

因此,TaskManager 将在

joinAll
中对您的对象调用 delete,因此
ft
包括它的
_series
将不再有效。

查看

std::shared_ptr
,使任务成为共享对象或其中包含的系列。对于这个任务,我认为图书馆有自己的
using TaskPtr = AutoPtr < Task >
,它实现了相同的引用计数想法。或者,在
main
中的任务之外创建系列向量,并将对它的引用存储在任务对象中(引用可以在构造函数中传递)。

© www.soinside.com 2019 - 2024. All rights reserved.