*** обнаружен glibc *** и проблемы с динамическим размещением — C++

У меня есть две проблемы, которые, я считаю, связаны. Я пытаюсь создать динамический массив переменных, а затем получить доступ к различным конкретным членам массива. Сегмент кода, вызывающий проблемы:

        double *F_inertia, *F_drag, *F_KN;
        i = 0;
        F_inertia = new double[i];
        F_drag = new double[i];
        F_KN = new double[i];
        t = 0; 
        x = 0;

        for (z = 0; z >= -d; z = z-8) {
          F_drag[i] = ((0.5 * rho * Cd * Diam * ux * fabs(ux)));
          F_inertia[i] = (rho * Cm * Vol * ax); 
          F_KN[i] = (F_drag[i] + F_inertia[i])/1000;
          cout << i << "\t" << F_KN[i]<< endl;
          i++;
        }
               cout << F_KN[1] << endl;

        delete[] F_inertia;
        delete[] F_drag;
        delete[] F_KN;     

Строка cout << i << "\t" << F_KN[i]<< endl; выводит значения правильно, и все значения правильно записываются в файл (ранее в коде). Однако когда я использую строку cout << F_KN[9] << endl; в качестве теста, чтобы убедиться, что эта позиция содержит правильное значение, она выводит 0, что не совпадает со значением i = 1tst позиция в цикле for. Примечание: значения для F_KN[5]-F_KN[8] делать печатаются правильно! Только не любой из нижних должностей! Я очень смущен этим!!

Во-вторых, после того, как код скомпилируется и запустится, после предоставления мне правильных значений (кроме первой проблемы) появляется следующее:

*** glibc detected *** ./monopile_deflection: free(): invalid next size (fast): 0x0000000001365260 ***
monopile_deflection: malloc.c:2451: sYSMALLOc: Assertion `(old_top == (((mbinptr) (((char *) &((av)->bins[((1) - 1) * 2])) - __builtin_offsetof (struct malloc_chunk, fd)))) && old_size == 0) || ((unsigned long) (old_size) >= (unsigned long)((((__builtin_offsetof (struct malloc_chunk, fd_nextsize))+((2 * (sizeof(size_t))) - 1)) & ~((2 * (sizeof(size_t))) - 1))) && ((old_top)->size & 0x1) && ((unsigned long)old_end & pagemask) == 0)' failed.
Aborted (core dumped)

Из чтения я знаю, что это связано с неправильным выделением массива или попыткой доступа к несуществующему значению массива, но я не вижу, в чем проблема?

Заранее спасибо за любую помощь или совет!


person user3460758    schedule 16.10.2014    source источник
comment
F_inertia = new double[i]; с i = 0; чувствует себя странно. см. stackoverflow.com/questions/ 1087042/   -  person Ferenc Deak    schedule 16.10.2014
comment
Хорошо, но без этого я получал предупреждение о том, что я могу быть неинициализирован? Я использую i просто для того, чтобы отслеживать, в какой позиции в массиве находится каждое значение F_KN, F_inertia и F_drag.   -  person user3460758    schedule 16.10.2014
comment
Разве мне не нужно динамически распределять массив?   -  person user3460758    schedule 16.10.2014
comment
@ user3460758: fritzone не предлагал вам полностью сбрасывать инициализацию; Он предложил исправить это!   -  person Lightness Races in Orbit    schedule 16.10.2014


Ответы (1)


i = 0;
F_inertia = new double[i];
F_drag = new double[i];
F_KN = new double[i];

Объем памяти, выделенный этими строками, не меняется волшебным образом, когда вы увеличиваете i позже в программе.

Итак, вы выделили три массива нулевого размера, а затем начали запись в его несуществующие элементы.
Вы испортили там много памяти.

Либо:

  • определить подходящее значение для i в отдельном цикле, который вы запускаете перед выделением, или
  • используйте std::vector<double>, который может автоматически расти для вас.
person Lightness Races in Orbit    schedule 16.10.2014
comment
Если бы мне нужно было определить отдельное значение для i, использовал бы я, например, F_inertia = new double[10] ? - person user3460758; 16.10.2014