gpt4 book ai didi

c++ bad_weak_ptr 错误

转载 作者:IT老高 更新时间:2023-10-28 21:36:30 30 4
gpt4 key购买 nike

我想创建一些 Timer 类,它每 N 秒打印一次“文本”,其中 N 将在构造函数中初始化。

#include <boost/asio.hpp>
#include <boost/bind.hpp>
#include <boost/enable_shared_from_this.hpp>

#include <iostream>

class Timer : public boost::enable_shared_from_this<Timer>
{
public:
Timer ( const double interval ) : interval_sec( interval )
{
io_service_ = new boost::asio::io_service;
timer_ = new boost::asio::deadline_timer ( * io_service_ );
start( );
io_service_ -> run( );
}

void start ( )
{
timer_ -> expires_from_now( boost::posix_time::seconds( 0 ) );
timer_ -> async_wait(boost::bind( &Timer::handler
, shared_from_this( )
, boost::asio::placeholders::error
)
);
}

private:
void handler( const boost::system::error_code& error )
{
if ( error )
{
std::cerr << error.message( ) << std::endl;
return;
}

printf( "text\n" );
timer_ -> expires_from_now( boost::posix_time::seconds( interval_sec ) );
timer_ -> async_wait( boost::bind( &Timer::handler
, shared_from_this( )
, boost::asio::placeholders::error
)
);
}

private:
boost::asio::io_service * io_service_;
boost::asio::deadline_timer * timer_;
double interval_sec;
};

int main()
{
boost::shared_ptr<Timer> timer( new Timer ( 10 ) );
return 0;
}

但我有 bad_weak_ptr 错误。

terminate called after throwing an instance of 'boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::bad_weak_ptr> >'
what(): tr1::bad_weak_ptr
Aborted

我做错了什么,我该如何解决?

最佳答案

问题很可能是您不能使用 shared_from_this 直到对象实际由共享指针管理。一般来说,在构造函数中启动线程或异步服务并不是一个好主意,因为您可能不走运,并且新线程可能在构造函数完成之前启动,从而在未完全构造的对象上执行。

在您的特定情况下,情况更糟,因为您在 Timer 类的构造函数中进入事件循环,这意味着控制永远不会返回到 main , 该对象永远不会由 main...中的 shared_ptr 管理...

你应该把对 start 的调用和对 run() 的调用移到另一个函数,然后从 main after 对象实际上是在 shared_ptr 中管理的。

关于c++ bad_weak_ptr 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5558734/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com