内存堆问题C++,具有动态分配多维数组的功能

Memory heap issue C++ , with dynamically allocating multi-dimensional array

本文关键字:数组 功能 动态分配 问题 C++ 内存      更新时间:2023-10-16

我从下面的C++脚本中得到内存堆消息。如果我删除了数组解除分配,错误就会消失。因此,错误可能在代码的解除分配部分。我搞不清

if(harmonic_type =='a')
{
    double ** harmonic_content = new double *[number_of_harmonics_required_to_monitor](); 
    for (int i=0;i<number_of_harmonics_required_to_monitor+1;i++) 
    {                                                           
        harmonic_content[i] = new double [2]();                 
    }
    harmonic_content =  harmonic_detector(waveformdata,number_of_samples,samplingrate_Hz, fundamental_frequency_Hz, number_of_harmonics_required_to_monitor,harmonic_type);
    for (int i=1;i<number_of_harmonics_required_to_monitor+1;i++)
    {                                   
        cout<<" Harmonic order "<< i << "::::" << harmonic_content[i][0] << " Hz ::::"<<harmonic_content[i][1] << " :::: "<<harmonic_content[i][2]<<endl;
    }
    for (int i=0;i<number_of_harmonics_required_to_monitor+1;i++) 
    {   
        delete [] harmonic_content [i];                 
    }
    delete [] harmonic_content;
}

在中

    new double *[number_of_harmonics_required_to_monitor]()

创建的元素总数:number_of_harmonics_required_to_monitor

在中

    for (int i=0;i<number_of_harmonics_required_to_monitor+1;i++)

写入的元素总数:number_of_harmonics_required_to_monitor+1(从0到number_of_harmonics_required_to_monitor

在中

    for (int i=1;i<number_of_harmonics_required_to_monitor+1;i++)

最后一个读取的元素不存在:它具有索引number_of_harmonics_required_to_monitor+1

您正在使用c++。所以利用它的优势。如果number_of_harmonics_required_to_monitor是一个编译时间常数,那么整个代码可以收缩为:

#include <array>
//...
auto* harmonic_content = new std::array<std::array<double, number_of_harmonics_required_to_monitor>, number_of_harmonics_required_to_monitor>;
for (int i=1;i<number_of_harmonics_required_to_monitor+1;i++)
{                                   
    cout<<" Harmonic order "<< i << " :::: " << (*harmonic_content)[i][0] << "Hz"
                                 << " :::: " << (*harmonic_content)[i][1] 
                                 << " :::: " << (*harmonic_content)[i][2] 
                                 <<endl;
}

delete harmonic_content;

如果它不是常数,可以使用sdt::vector。

更好的方法是使用一些矩阵实现来跟踪自己的内存。