【问题标题】:Memory heap issue C++ , with dynamically allocating multi-dimensional array内存堆问题 C++,动态分配多维数组
【发布时间】:2014-09-23 11:00:44
【问题描述】:

我从以下 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;
}

【问题讨论】:

    标签: c++ arrays memory-management memory-leaks multidimensional-array


    【解决方案1】:

        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

    【讨论】:

      【解决方案2】:

      您正在使用 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。

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

      【讨论】:

        猜你喜欢
        • 2012-10-07
        • 2014-07-19
        • 2013-05-27
        • 1970-01-01
        • 1970-01-01
        • 2021-07-21
        • 1970-01-01
        • 2015-09-05
        • 2020-07-11
        相关资源
        最近更新 更多