Я использую opencv под окнами с MSVC-2013. Я получаю утечки памяти. Теперь я пытаюсь выяснить, где они находятся.OpenCV: Является ли cv :: mat как shared_ptr?
Я достал все вещи, принадлежащие opencv, и они исчезли. Я хватаю их, создавая камеру, подталкиваю их к очереди, работаю над ними, подталкиваю их к видеозаписывающему устройству и тому же объекту в cui, где он отображается для пользователя.
Я использую как в большинстве случаев локальные объекты и думал, что cv::Mat
похож на std::shared_ptr<T>
. Я часто использую costructs как
void CChildView::OnPaint()
{
CPaintDC dc(this); // Gerätekontext zum Zeichnen
// get the current image to convert it
cv::Mat curr_img;
{
lock lk(m_monitor_gui);
curr_img = m_gui_image.clone();
}
....
}
Моей очередь выглядит следующим образом:
cv::Mat m_gui_image;
struct img_data
{
time_point_t time;
int nr;
cv::Mat img;
};
std::deque<img_data> m_grab_2_write;
............. grabber thread
// copy it to the writer queue
{
lock lk(m_monitor_grab_write);
// clone the raw frame
cv::Mat to_other_thread;
to_other_thread = raw_frame.clone();
img_data tmp;
tmp.nr = cnt++;
tmp.img = to_other_thread;
tmp.time = now;
m_grab_2_write.push_back(tmp);
}
............. worker thread
// get all images from the queue
std::deque<img_data> all_images;
{
lock lk(m_monitor_grab_write);
all_images = m_grab_2_write;
m_grab_2_write.clear();
}
......
// copy the current image to the display
{
lock lk(m_monitor_gui);
m_gui_image = current_frame.img;
}
Сейчас я работаю с местным all_images очереди, чтобы блокировать Грабер нити только за минимальное количество времени.
В рабочем я вытаскиваю их из локальной очереди.
Это дизайн, который я часто использовал в Halcon и других библиотеках и не имел утечек .... Где может быть проблема?
Утечка появляется, когда только один cv :: mat выделяется в стеке в обработчике OnPaint()
. Я ничего не делаю с ней, просто локальная переменная. Я попытался воспроизвести его в простом консольном приложении, но он не появился.
Я использую opencv 2.4.9.
Я вытащил все, что касается opencv, и я проверяю, что нет ничего, что загружалось в opencv reagring.
Тогда я добавить следующее "PaintHandler" для моего приложения:
void CChildView::OnPaint()
{
lock lk(m_monitor_gui);
CPaintDC dc(this);
// get the current image to convert it
cv::Mat m;
}
Тогда просачивается. Когда я удаляю локальную переменную cv::Mat m
, она не течет.
Detected memory leaks!
Dumping objects ->
{157} normal block at 0x005EDA48, 29 bytes long.
Data: < X^_^ > 00 00 00 00 58 DA 5E 00 5F DA 5E 00 00 00 00 00
{156} normal block at 0x005ED9B8, 77 bytes long.
Data: < ^ ( > CD CD CD CD B8 D9 5E 00 00 00 00 00 28 00 00 00
{155} normal block at 0x005ED930, 74 bytes long.
Data: < 0^> CD CD CD CD CD CD CD CD CD CD CD CD 30 D9 5E 00
{154} normal block at 0x005ED8A8, 73 bytes long.
Data: < ^ ( > CD CD CD CD A8 D8 5E 00 00 00 00 00 28 00 00 00
{153} normal block at 0x005ED818, 81 bytes long.
Data: < ^ ( > CD CD CD CD 18 D8 5E 00 00 00 00 00 28 00 00 00
{152} normal block at 0x005ED790, 73 bytes long.
Data: < ^> CD CD CD CD CD CD CD CD CD CD CD CD 90 D7 5E 00
{151} normal block at 0x005ED700, 81 bytes long.
Data: < ^> CD CD CD CD CD CD CD CD CD CD CD CD 00 D7 5E 00
{150} normal block at 0x005ED208, 76 bytes long.
Data: < ^ ( > CD CD CD CD 08 D2 5E 00 00 00 00 00 28 00 00 00
Object dump complete.
течи результат с одним неиспользованного cv::Mat
Да, я использую общие библиотеки. Я всегда использую блокировки/мьютексы, чтобы предотвратить модификацию 'cv: Mat'. 'std :: shared_ptr <>' - это сохранить поток для копирования. Я думаю, 'cv: Mat' не является нитью для копирования. Консольное приложение не выдавало никакой памяти. Я пытаюсь определить его более вниз и использовать depend.exe, чтобы посмотреть, есть ли несоответствия CRT. –
Попробуйте запустить код поочередно в одном потоке, чтобы узнать, связаны ли утечки MT. –
Это мой обработчик OnPaint. Это утечка. –