通过值

时间:2016-02-22 08:15:15

标签: c++ shared-ptr

亲爱的stackoverflow人员。

我有一个名为FcgiManager的类,用于处理正确数量的fastcgi worker。 目前,它有一个简单的方法来添加新的工作者列表:

bool FcgiManager::AddWorker() {

  workers_.push_back(std::make_unique<FcgiWorker>(server_));
  return true;
}

“workers_”字段是:

private:
 // cut 
 std::list<std::unique_ptr<FcgiWorker>> workers_;

程序以“坏弱指针”异常退出。 当我跟踪它时,我看到从这个方法它确实到达了FcgiWorkes构造函数,这里是:

FcgiWorker::FcgiWorker(std::shared_ptr<Dolly> server) :
  running_{false}, pool_{std::make_unique<FcgiRequestPool>()}, server_{server}  {
  // actual code is not important, because execution doesn't get here.
}

我看到,“server”参数shared_ptr在其结构中有一些火星值,如count = 1443278,weak = -1。

但是在AddWorker()方法中,在进入FcgiWorker构造函数之前,“server_”字段具有适当的值。 我甚至向服务器添加了一个“IsAlive()”方法,并尝试从AddWorker()调用服务器_-&gt; IsAlive(),是的,它还活着。

我还试图明白地创建一个像这样的工人: 任何建议表示赞赏     bool FcgiManager :: AddWorker(){

  FcgiWorker test(server_);
  return true;
}

检查我是否对make_unique做错了,但结果是一样的。

任何建议表示赞赏。

更新-1:

FcgiWorker :: server_是:

std::shared_ptr<Dolly> server_;

它在FcgiWorker构造函数的初始化列表中初始化,请参阅上面的构造函数代码。

更新-2

FcgiManager :: server_是:

std::shared_ptr<Dolly> server_;

以下是它在main.cpp中的创建方式:

auto server = std::make_shared<Dolly>();
server->BindFcgiManagerToServer();
server->Run();

server.cpp:

Dolly::Dolly() : start_time_{std::time(nullptr)} {
  fcgi_manager_ = std::make_unique<FcgiManager>();
}

void Dolly::BindFcgiManagerToServer() {
  fcgi_manager_->set_server(self());
}

server.h:

class Dolly : public std::enable_shared_from_this<Dolly> {
 private:
  // cut
  inline std::shared_ptr<Dolly> self() { return shared_from_this(); }

更新-3 &amp; 更新-4 &amp;的 5

创建MCVE,哦,好吧 - 它编译并且不会抛出。所以我想我现在必须自己解决我的问题:) 谢谢大家!

(MCVE已更新两次,因为第一次没有完成)

#include <memory>
#include <list>
#include <iostream>

class Dolly;

class FcgiRequestPool {
};

class FcgiWorker {

 public:
  FcgiWorker(std::shared_ptr<Dolly> server) :
    pool_{std::make_unique<FcgiRequestPool>()}, server_{server}  {
      std::cout << "worker created" << std::endl << std::flush;
  }


 private:
  std::shared_ptr<FcgiRequestPool> pool_;
  std::shared_ptr<Dolly> server_;

};

class FcgiManager {

 public:
  inline void set_server(std::shared_ptr<Dolly> server) { server_ = server; }
  bool InitWorkers() {
    auto workers_num = 4;
    auto created_workers_num = 0;
    try {
      for (created_workers_num = 0; created_workers_num < workers_num; created_workers_num++) {
        AddWorker();
      }
    } catch (std::exception& e) {
      std::cout << e.what() << std::endl << std::flush;
    }

    return true;
  }
  void Run() {
    InitWorkers();
  }


 private:
  bool AddWorker() {

    workers_.push_back(std::make_unique<FcgiWorker>(server_));
    return true;
  }

  std::list<std::unique_ptr<FcgiWorker>> workers_;
  std::shared_ptr<Dolly> server_;
};

class Dolly : public std::enable_shared_from_this<Dolly> {

 public:
  Dolly() {
    fcgi_manager_ = std::make_unique<FcgiManager>();
  }
  void BindFcgiManagerToServer() {
    fcgi_manager_->set_server(self());
  }
  void Run() {
    fcgi_manager_->Run();
  }

 private:
  std::unique_ptr<FcgiManager> fcgi_manager_;
  std::shared_ptr<Dolly> self() { 
    return shared_from_this(); 
  }
};


int main() {
  auto server = std::make_shared<Dolly>();
  server->BindFcgiManagerToServer();
  server->Run();

  return 0;
}

解决

创建MCVE并将其与实际程序逐步比较后,我发现在这里生成了shared_ptr异常:

 pool_{std::make_unique<FcgiRequestPool>()}

与整个类创建逻辑无关。 我将MCVE建议的答案标记为有效,因为它实际上是一个很好的建议,它确实帮助了我。

根本原因:我正在为一个类创建一个unique_ptr,该类派生自std :: enable_shared_from_this。

0 个答案:

没有答案