C++ 动态多维数组的申请与释放
今天在实验室的项目中遇到了一个问题,直接上代码:
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;
}
这样就不会出现内存泄漏的问题了!
C++ 动态多维数组的申请与释放的更多相关文章
- 2017.11.17 C++系列---用malloc动态给c++二维数组的申请与释放操作
方法一:利用二级指针申请一个二维数组. #include<stdio.h> #include<stdlib.h> int main() { int **a; //用二级指针动态 ...
- C++建立动态二维数组
C++建立动态二维数组主要有两种方法: 1.使用数组指针,分配一个指针数组,将其首地址保存在b中,然后再为指针数组的每个元素分配一个数组 int * ...
- 以杨辉三角为例,从内存角度简单分析C语言中的动态二维数组
学C语言,一定绕不过指针这一大难关,而指针最让人头疼的就是各种指向关系,一阶的指针还比较容易掌握,但一旦阶数一高,就很容易理不清楚其中的指向关系,现在我将通过杨辉三角为例,我会用四种方法从内存的角度简 ...
- C语言中二维数组如何申请动态分配内存
C语言中二维数组如何申请动态分配内存: 使用malloc函数,先分配第一维的大小,然后再循环分配每一维的大小 #include <stdio.h> #include <malloc. ...
- C++ 里 构建动态二维数组
//****动态二维数组 /* int m=3; int **data; int n=2; data=new int*[m]; for(int j=0;j<m;j++) { data[j]=ne ...
- C++动态二维数组的创建
两种方式. 一,二级指针,创建2行3列的动态二维数组. 这里,p指向的是2个地址,这两个地址各指向长度为3的一维整型数组. 在内存中,每行元素内部顺序排列.两行元素的首地址不同,p[1]与p[2]存放 ...
- 动态二维数组赋值及for循环遍历和toString遍历
package com.Summer_0421.cn; import java.util.Arrays; /** * @author Summer * 动态二维数组赋值及for循环遍历和toStrin ...
- C语言批量数据到动态二维数组
上一篇文章将文件读取放到静态创建的二维数组中,可是结合网络上感觉到今天的DT时代,这样批量大量读取一个上百行的数据,分配的内存是否可能由于大量的数据而产生溢出呢,近期一直研究里malloc函数.通过它 ...
- 【C/C++】vector 动态二维数组
声明 vector<vector<int> vec; //赋值思路可以从这个很基础的操作里看出来 vector<int> a; a.push_back(1); a.pus ...
随机推荐
- 【PostgreSQL】安装使用步骤
1.下载地址 https://www.postgresql.org/download/windows/ 下载按照较新版本,和平台相一致就好 2.安装 选择安装地址 数据存放地址 密码设置 端口使用默认 ...
- [WASM Rust] Create and Publish a NPM Package Containing Rust Generated WebAssembly using wasm-pack
wasm-pack is a tool that seeks to be a one-stop shop for building and working with Rust generated We ...
- Mac装Win10后没有无线网络的处理
在“文件资源管理器”中找到“此电脑”,打开,看到“设备与驱动管理器”,找到Bootcamp文件夹,点击进入,运行setup,之后重启就好了.
- Visual Studio VS如何统计代码行数
编辑-查找和替换-在文件中查找,然后查找内容填写下面的东西,勾选使用正则表达式,点击查找全部 b*[^:b#/]+.*$ 在查找结果的最后一行显示了总的行数和文件数 ...
- 谜题 之 C语言
本篇文章展示了14个C语言的迷题以及答案.代码应该是足够清楚的,并且我也相信有相当的一些样例可能是我们日常工作可能会见得到的.通过这些迷题,希望你能更了解C语言.假设你不看答案.不知道是否有把握回答各 ...
- maven插件介绍之maven-jar-plugin
maven-jar-plugin 插件的maven依赖为: <dependency> <groupId>org.apache.maven.plugins</groupId ...
- ListView 实现带有Filpper效果的左右滑动删除 Item
ListView 实现带有Filpper效果的左右滑动删除 Item 的实现最基本的方法还是 对 Listview 的继承重写 .然后是在删除过程中加入 TranslateAnimation 滑动事 ...
- Linux上Libevent的安装
1.下载wget -O libevent-2.0.21-stable.tar.gz https://github.com/downloads/libevent/libevent/libevent-2. ...
- SDOI2016R1(不是解题报告)
话说洗澡的时候想了一堆要说的,坐到电脑前反而不知所措了-- 序章 听学长说他们都是省选一周前才停的课.然而我们这届--自聪哥韩大他们在省选两周前悄悄跑路后(据说班主任非常支持),信息小组内部一呼百应, ...
- Yarn调度器负载模拟器——Yarn Scheduler Load Simulator (SLS)
一.概述: Yarn调度器有很多实现,如Fifo, Capacity和Fair schedulers等.与其同一时候,正在进行一些优化措施来提高调度器在不同负载和工作场景下的性能.每一个调度器都有自己 ...