zoukankan      html  css  js  c++  java
  • 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 = 0; i < img.rows; i++)
            {
                samples[i] = new uchar *[img.cols];
                for (int j = 0; 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 + 1];
                    for (int k = 0; k < num_samples + 1; k++)
                    {
                        // 创建样本库时,所有样本全部初始化为0
                        // All Samples init as 0 When Creating Sample Library.
                        samples[i][j][k] = 0;
                    }
                }
            }
    
            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 = 0; i < imgrow; i++)
            {
                for (int j = 0; j < imgcol; j++)
                {
                    delete samples[i][j];
                }
                delete samples[i];
            }
            delete[] samples;
        }

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

  • 相关阅读:
    小*号
    进制转换升级版
    对角线的值
    使用Arduino开发板控制步进电机
    使用VisualGDB和OpenOCD调试STM32L0开发板
    基于STM32L476开发板的USB音频设备
    【FRDM-K64F学习笔记】使用ARM mbed和Keil MDK下载你的第一个程序
    使用超声波传感器HC-SR04检测障碍物
    使用Atmel Studio编程Arduino Uno开发板
    重新编程Hexiwear Docking Station扩展坞
  • 原文地址:https://www.cnblogs.com/lustar/p/8576258.html
Copyright © 2011-2022 走看看