QPixmap 导致内存泄漏?
QPixmap causes memory leak?
每次收到有效帧时,我都会从服务器流式传输 MJPEG 并更新 QLabel 的 QPixmap。内存使用量随着时间的推移而膨胀,我不明白为什么。这是对 QPixmap 的错误使用吗?
case StreamState::Streaming: {
int ind_start_bytes = m_buffer.indexOf("\xff\xd8");
int ind_end_bytes = m_buffer.indexOf("\xff\xd9");
if(ind_start_bytes != -1 && ind_end_bytes != -1) {
if(ind_start_bytes < ind_end_bytes){
QByteArray image_data = m_buffer.mid(ind_start_bytes, ind_end_bytes + 2);
m_buffer = m_buffer.mid(ind_end_bytes+2);
QPixmap pmap;
if(pmap.loadFromData(image_data, "JPEG")) {
setPixmap(pmap.scaled(pmap.size(), Qt::KeepAspectRatio));
}
}
}
}
这是完整代码的 github link。 mjpegstreamer.cpp
相关代码。
肿胀的是m_buffer。我发布的代码使用 fifo 逻辑的帧。所以我更换了
int ind_start_bytes = m_buffer.indexOf("\xff\xd8");
int ind_end_bytes = m_buffer.indexOf("\xff\xd9");
与
int ind_start_bytes = m_buffer.lastIndexOf("\xff\xd8");
int ind_end_bytes = m_buffer.lastIndexOf("\xff\xd9");
如果 m_buffer
中存在任何一帧以上的帧,我们将使用最后一帧并删除左侧的帧。
现在问题似乎已经解决了。
这显然与 QPixmap
.
无关
每次收到有效帧时,我都会从服务器流式传输 MJPEG 并更新 QLabel 的 QPixmap。内存使用量随着时间的推移而膨胀,我不明白为什么。这是对 QPixmap 的错误使用吗?
case StreamState::Streaming: {
int ind_start_bytes = m_buffer.indexOf("\xff\xd8");
int ind_end_bytes = m_buffer.indexOf("\xff\xd9");
if(ind_start_bytes != -1 && ind_end_bytes != -1) {
if(ind_start_bytes < ind_end_bytes){
QByteArray image_data = m_buffer.mid(ind_start_bytes, ind_end_bytes + 2);
m_buffer = m_buffer.mid(ind_end_bytes+2);
QPixmap pmap;
if(pmap.loadFromData(image_data, "JPEG")) {
setPixmap(pmap.scaled(pmap.size(), Qt::KeepAspectRatio));
}
}
}
}
这是完整代码的 github link。 mjpegstreamer.cpp
相关代码。
肿胀的是m_buffer。我发布的代码使用 fifo 逻辑的帧。所以我更换了
int ind_start_bytes = m_buffer.indexOf("\xff\xd8");
int ind_end_bytes = m_buffer.indexOf("\xff\xd9");
与
int ind_start_bytes = m_buffer.lastIndexOf("\xff\xd8");
int ind_end_bytes = m_buffer.lastIndexOf("\xff\xd9");
如果 m_buffer
中存在任何一帧以上的帧,我们将使用最后一帧并删除左侧的帧。
现在问题似乎已经解决了。
这显然与 QPixmap
.