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

   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++ 动态多维数组的申请与释放的更多相关文章

  1. 2017.11.17 C++系列---用malloc动态给c++二维数组的申请与释放操作

    方法一:利用二级指针申请一个二维数组. #include<stdio.h> #include<stdlib.h> int main() { int **a; //用二级指针动态 ...

  2. C++建立动态二维数组

    C++建立动态二维数组主要有两种方法: 1.使用数组指针,分配一个指针数组,将其首地址保存在b中,然后再为指针数组的每个元素分配一个数组                           int * ...

  3. 以杨辉三角为例,从内存角度简单分析C语言中的动态二维数组

    学C语言,一定绕不过指针这一大难关,而指针最让人头疼的就是各种指向关系,一阶的指针还比较容易掌握,但一旦阶数一高,就很容易理不清楚其中的指向关系,现在我将通过杨辉三角为例,我会用四种方法从内存的角度简 ...

  4. C语言中二维数组如何申请动态分配内存

    C语言中二维数组如何申请动态分配内存: 使用malloc函数,先分配第一维的大小,然后再循环分配每一维的大小 #include <stdio.h> #include <malloc. ...

  5. C++ 里 构建动态二维数组

    //****动态二维数组 /* int m=3; int **data; int n=2; data=new int*[m]; for(int j=0;j<m;j++) { data[j]=ne ...

  6. C++动态二维数组的创建

    两种方式. 一,二级指针,创建2行3列的动态二维数组. 这里,p指向的是2个地址,这两个地址各指向长度为3的一维整型数组. 在内存中,每行元素内部顺序排列.两行元素的首地址不同,p[1]与p[2]存放 ...

  7. 动态二维数组赋值及for循环遍历和toString遍历

    package com.Summer_0421.cn; import java.util.Arrays; /** * @author Summer * 动态二维数组赋值及for循环遍历和toStrin ...

  8. C语言批量数据到动态二维数组

    上一篇文章将文件读取放到静态创建的二维数组中,可是结合网络上感觉到今天的DT时代,这样批量大量读取一个上百行的数据,分配的内存是否可能由于大量的数据而产生溢出呢,近期一直研究里malloc函数.通过它 ...

  9. 【C/C++】vector 动态二维数组

    声明 vector<vector<int> vec; //赋值思路可以从这个很基础的操作里看出来 vector<int> a; a.push_back(1); a.pus ...

随机推荐

  1. Spring启动流程

    首先,对于一个web应用,其部署在web容器中,web容器提供其一个全局的上下文环境,这个上下文就是ServletContext,其为后面的spring IoC容器提供宿主环境: 其次,在web.xm ...

  2. 【Gradle】配置中引用的jar包版本后面自动加冒号导致引入jar包失败的问题/gradle中引用jar包版本不一致的问题/gradle中引用jar失败的问题 解决方法

    idea中 gradle中 引用jar包,版本后面默认加:的问题 gradle中引用jar包版本不一致的问题 gradle中引用jar失败的问题 如上题目所示,三个问题其实都是同一样的简单又恶心,因为 ...

  3. 使用Myeclipse + SVN + TaoCode 免费实现项目版本控制的详细教程

    通过Myeclipse + SVN插件 + TaoCOde可以省去代码仓库的租建:同时还可以很好的满足小团队之间敏捷开发的需求.接下来详细介绍整个搭建流程. 首先,介绍所用到的工具: 1,Myecli ...

  4. 计算机视觉人脸相关开源项目总结:face_recognition

    计算机视觉人脸相关开源项目总结 https://github.com/ageitgey/face_recognition 深度学习人脸关键点检测方法----综述

  5. [Servlet&amp;JSP] 标准标签

    在JSP的规范中提供了一些标准标签(Standard Tag),全部的容器都支持这些标签,它能够协助编写JSP时降低Scriptlet的使用. 全部的标准标签都使用jsp:作为前置.这些标准标签是在J ...

  6. android 4.4以上能够实现的沉浸式状态栏效果

    仅仅有android4.4以及以上的版本号才支持状态栏沉浸效果 先把程序执行在4.4下面的手机上,看下效果: 在4.4以上的效果: watermark/2/text/aHR0cDovL2Jsb2cuY ...

  7. C#语法复习1

    一.C#与.net框架 .net是语言无关的. 程序的执行流程: .net兼容语言的源代码文件 .net兼容编译器 程序集(公共中间语言(CIL)common intermediate languag ...

  8. android-custom-tab-with-viewpager

    https://github.com/eltld/android-custom-tab-with-viewpager

  9. openwrt gstreamer实例学习笔记(六. gstreamer Pads及其功能)

    一:概述 如我们在Elements一章中看到的那样,Pads是element对外的接口.数据流从一个element的source pad到另一个element的sink pad.pads的功能(cap ...

  10. 项目Beta冲刺(团队6/7)

    项目Beta冲刺(团队6/7) 团队名称: 云打印 作业要求: 项目Beta冲刺(团队) 作业目标: 完成项目Beta版本 团队队员 队员学号 队员姓名 个人博客地址 备注 221600412 陈宇 ...