0

我正从下面的C++脚本获取内存堆消息。如果我删除数组重新分配,错误消失。所以这个bug可能在代码的释放部分。我不能能够找出内存堆问题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; 
} 

回答

2

在创建

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

0

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

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