OPENCV:是CV :: MAT,就像共享_ptr一样
OpenCV: Is cv::mat like a shared_ptr?
我在Windows下使用MSVC-2013的OpenCV。我得到内存泄漏。现在我尝试弄清楚它们在哪里。
我掏出所有属于OpenCV的东西,它们消失了。我抓住它们构架相机,将它们推到队列,对其进行工作,将它们推到视频作者和相同的对象到CUI,并向用户展示它。
我像大多数时间一样使用本地对象,并认为cv::Mat
就像std::shared_ptr<T>
。我经常使用
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队列一起工作,仅在最小的时间内阻止抓地力。
在工人中,我将它们从当地队列中拉出来。
while (all_images.size())
{
img_data current_frame = all_images.front();
all_images.pop_front();
.... do work with current_frame
这是我经常在Halcon和其他库下使用的设计,没有泄漏。...在哪里可能是问题?
当仅在OnPaint()
处理程序的堆栈中分配一个CV :: MAT时,会出现泄漏。我绝对什么都不做,只是一个局部变量。我试图在普通的控制台应用程序中复制它,但没有显示。
我使用opencv 2.4.9。
我拔出了有关OpenCV的所有内容,并与我核实没有opencv重新格式加载。
然后,我将以下" Pachandler"添加到我的应用程序:
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
确实像 shared_ptr<>
,不应泄漏正确分配的数据。
要调试尝试简化您的代码为单线线程。
您的错误可能与多线程问题或CRT不匹配有关。您是否正在与共享libs联系?
静态链接通常可以解决这些问题。
静态链接确实解决了此问题。现在没有内存泄漏。
相关文章:
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 在cuda线程之间共享大量常量数据
- 如何从具有移动语义的类对象中生成共享指针
- 在c代码之间共享数据的最佳方式
- 在两个类中共享相同的函数调用,并在不需要时避免空实例化
- 将静态库链接到不带-fPIC的共享库中
- 为什么std::互斥需要很长的、非常不规则的时间来共享
- 使用Boost Interprocess创建托管共享内存需要很长时间
- 无法在Ubuntu上将共享库与Eclipse链接
- 从python调用openMP共享库时,未定义opnMP函数
- 在为LINUX创建共享库时,如何避免STL的私有/弱副本
- 如何将不同的可执行文件合并到一个窗口框架中进行编码?像浏览器一样
- 为什么我的共享库中存在展开符号
- 使用共享指针的函数调用,其对象应为 const
- 具有两个独占锁组的共享锁
- 为什么在C++中对链表这样做?(像堆叠一样处理它们)
- 共享队列的线程安全
- 共享指针和具有自定义删除程序的唯一指针之间的语法差异背后的任何原因
- OPENCV:是CV :: MAT,就像共享_ptr一样