今天在实验室的项目中遇到了一个问题,直接上代码:

   void ViBe::init(Mat img)
{
imgcol = img.cols;
imgrow = img.rows;
// 动态分配三维数组,samples[][][num_samples]存储前景被连续检测的次数
// Dynamic Assign 3-D Array.
// sample[img.rows][img.cols][num_samples] is a 3-D Array which includes all pixels' samples.
samples = new unsigned char **[img.rows];
for (int i = ; i < img.rows; i++)
{
samples[i] = new uchar *[img.cols];
for (int j = ; j < img.cols; j++)
{
// 数组中,在num_samples之外多增的一个值,用于统计该像素点连续成为前景的次数;
// the '+ 1' in 'num_samples + 1', it's used to count times of this pixel regarded as foreground pixel.
samples[i][j] = new uchar[num_samples + ];
for (int k = ; k < num_samples + ; k++)
{
// 创建样本库时,所有样本全部初始化为0
// All Samples init as 0 When Creating Sample Library.
samples[i][j][k] = ;
}
}
} FGModel = Mat::zeros(img.size(), CV_8UC1);
}

这段代码是我在Github上面直接下载的,是一段ViBe背景建模的代码。代码的内容是分配图像各个点sample的数组,也就是说每个点有一个样本集,总共是cols*rows*sample_num个数值,所以做成了一个三维数组的形式。

问题出现在析构上面。一开始我没有看代码是怎么写的,直到有一个测试视频,因为镜头大范围的晃动,按照流程多次重建了ViBe背景,出现了内存不足而崩溃的问题。

首先想到的就是动态分配的数组没有正确析构。看原本的析构代码:

void ViBe::deleteSamples()
{
delete samples;
} ViBe::~ViBe()
{
deleteSamples();
}

这样的写法并不能正确释放申请的内存。具体原因,我猜测可能是因为申请到的内存并不是连续的,从而这样只能释放掉一个二重指针组成的数组。

正确的做法,应该是按照与申请内存相反的方向进行释放,代码如下:

void ViBe::deleteSamples()
{
for (int i = ; i < imgrow; i++)
{
for (int j = ; j < imgcol; j++)
{
delete samples[i][j];
}
delete samples[i];
}
delete[] samples;
}

这样就不会出现内存泄漏的问题了!

最新文章

  1. 1.JAVA基础复习——计算机基础与环境变量配置
  2. TextVeiw 的 No package identifier when getting value for resource numb
  3. 【原创】kafka producer源代码分析
  4. angular的$scope,这东西满重要的
  5. asp.net mvc视图中嵌套分部视图
  6. gridview 绑定方法中带参数
  7. Fox Roddick interviw Federer before 2013 US Open
  8. apache ambari web页面无法访问解决办法
  9. mysql 表格中的数据量过大,修改数据库字段信息会花费很长的时间
  10. 【C语言】单片机上的按键检测框架
  11. 关于Opengl中将24位BMP图片加入一个alpha通道并实现透明的问题
  12. ElasticSearch 学习记录之集群分片内部原理
  13. JAVA_SE基础——32.this关键字调用本类的构造方法
  14. java.lang.ClassNotFoundException: org.springframework.http.converter.json.MappingJacksonHttpMessageConverter
  15. JVM学习一:JVM运行时数据区
  16. python学习笔记(2)--基本语法元素
  17. 数据结构(C语言版)-第6章 图
  18. POJ 2707
  19. 我所理解的网络游戏&lt;一&gt;:网游的顶层设计
  20. Python浮点算术:争议和限制

热门文章

  1. 在chrome中屏蔽百度推荐
  2. git log 查看版本演变历史
  3. UVA 1482 - Playing With Stones(SG打表规律)
  4. 使用FMDB多线程訪问数据库,及database is locked的问题
  5. HDU 2018 母牛的故事 [补]
  6. Django-权限信息中间件操作
  7. Arduino 网络时钟client
  8. iOS 开发之 - 关闭键盘 退出键盘 的5种方式
  9. 性能问题案例02——sybase连接堵塞问题
  10. C++结构体中使用函数与类中使用函数小结