亲爱的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。