C++ 动态多维数组的申请与释放
2024-08-26 03:57:56
今天在实验室的项目中遇到了一个问题,直接上代码:
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.JAVA基础复习——计算机基础与环境变量配置
- TextVeiw 的 No package identifier when getting value for resource numb
- 【原创】kafka producer源代码分析
- angular的$scope,这东西满重要的
- asp.net mvc视图中嵌套分部视图
- gridview 绑定方法中带参数
- Fox Roddick interviw Federer before 2013 US Open
- apache ambari web页面无法访问解决办法
- mysql 表格中的数据量过大,修改数据库字段信息会花费很长的时间
- 【C语言】单片机上的按键检测框架
- 关于Opengl中将24位BMP图片加入一个alpha通道并实现透明的问题
- ElasticSearch 学习记录之集群分片内部原理
- JAVA_SE基础——32.this关键字调用本类的构造方法
- java.lang.ClassNotFoundException: org.springframework.http.converter.json.MappingJacksonHttpMessageConverter
- JVM学习一:JVM运行时数据区
- python学习笔记(2)--基本语法元素
- 数据结构(C语言版)-第6章 图
- POJ 2707
- 我所理解的网络游戏<;一>;:网游的顶层设计
- Python浮点算术:争议和限制