0

Я получаю сообщение кучи памяти из следующего сценария C++. Если я удалю освобождение массива, ошибка исчезнет. Таким образом, ошибка может быть в части освобождения кода. Я не могу в состоянии выяснитьОшибка кучи памяти 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 :: вектора.

Еще лучше было бы использовать некоторую матричную реализацию, которая отслеживает ее собственную память.

Смежные вопросы