template<typename V>
class Counter
: public boost::enable_shared_from_this<Counter<V> > {
public:
Counter(boost::asio::io_service& io_service, uint32_t update_interval)
: current_load_(std::numeric_limits<V>::min()),
last_load_(std::numeric_limits<V>::min()),
max_load_value_(std::numeric_limits<V>::max()),
update_timer_(CreateTimer(io_service)),
update_interval_(update_interval) {
}
void Start() {
update_timer_->Start(boost::bind(&SingleLoadCounter::UpdateLoad,
this->shared_from_this(), _1),
boost::posix_time::milliseconds(update_interval_));
}
void Stop() {
update_timer_->Stop();
}
private:
void UpdateLoad(std::function<void(bool redial)> callback) {
{
boost::unique_lock<boost::mutex> lock(mutex_);
last_load_ = current_load_;
current_load_ = 0;
}
callback(true);
}
V current_load_;
V last_load_;
V max_load_value_;
TimerPtr update_timer_;
uint32_t update_interval_;
boost::mutex mutex_;
};
在boost::shared_ptr
地址update_timer_.px
中创建此类的实例后有效。但是当我在Stop()中调用update_timer_
上的方法时,我得到了分段错误,因为update_timer_.px
指向了错误的位置。
update_timer_.px
的地址:
Counter
的构造函数中:0x1b15b50 Stop
:0x1b15b3000000000 在gdb下运行它,我看到0x1b15b3是update_timer_.pn
的地址。所以不知怎的this->update_timer_.px
前进了几位
所有这些都是在发布目标上完成的。在调试它工作正常。类Counter
用作shared_prt
,模板类型为uint32_t
System: Ubuntu 10.4 x64, gcc: 4.7.2