[英]Boost asio async_write_some leaking?
我一直在搞一個使用boost :: asio進行UDP和SocketCAN通信的應用程序。 今天,我注意到了一些奇怪的東西-它正在泄漏內存!
所以我抓起了我的可信賴的工具包,其中包括
echo 0 $(awk '/Private/ {print "+", $2}' /proc/`pidof main`/smaps) | bc
和Allinea DDT,並開始診斷此問題。
我最后得到的是以下代碼段,它利用了boost :: asio :: posix :: basic_stream_descriptor作為基礎:
void Can::write(struct can_frame frame) {
stream_.async_write_some(boost::asio::buffer(&frame, sizeof(frame)),
boost::bind(&Can::datSend, this)
);
}
在這里,datSend只是一個空函數,可以對看門狗執行ping操作。 我也嘗試過
void Can::write(struct can_frame frame) {
stream_.write_some(boost::asio::buffer(&frame, sizeof(frame)));
}
但是由於某種原因,這會導致異常(無效數據)。
該代碼的后端看起來像這樣:
boost::asio::io_service ioService_;
boost::asio::posix::basic_stream_descriptor<> stream_;
Constructor() : stream_(ioService_) {
socketDescriptor_ = socket(PF_CAN, SOCK_RAW, CAN_RAW);
struct timeval timeout {
.tv_sec = 5,
.tv_usec = 0
};
if (setsockopt(socketDescriptor_, SOL_SOCKET, SO_RCVTIMEO,
reinterpret_cast<char *>(&timeout),
sizeof(timeout)) < 0) {
throw std::string("Error setting CAN socket timeout");
}
strcpy(interfaceRequest_.ifr_name, interfaceName.c_str());
ioctl(socketDescriptor_, SIOCGIFINDEX, &interfaceRequest_);
socketAddress_.can_family = AF_CAN;
socketAddress_.can_ifindex = interfaceRequest_.ifr_ifindex;
stream_.assign(socketDescriptor_);
if (bind(socketDescriptor_, (struct sockaddr *)&socketAddress_,
sizeof(socketAddress_)) < 0) {
throw std::string("Error in socket bind");
}
}
之后,我只運行ioservice,就是這樣:
void Can::iosThreadWorker() { ioService_.run(); }
我已經討論了很多stackoverflow主題以及boost文檔,但是似乎找不到為什么此函數會泄漏內存的原因。
Boost版本-1.60 G ++-6.30操作系統:Ubuntu 17.04
因此,我進行了更深入的研究,發現了關於boost.io_service的一些提示:
io_service.run()如果沒有工作要做,則完成-因此,通過運行它並發送更多要完成的異步工作,該工作尚未完成。
這源於一個問題,即有人翻轉了ioservice.run()和異步讀取回調分配以使代碼看起來更好-現在在運行之前沒有任何工作堆積,ioservice可以完成其工作並返回。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.