Динамический массив

Тема в разделе "Arduino & Shields", создана пользователем bigory, 23 окт 2018.

  1. bigory

    bigory Нерд

    Всем доброго времени суток и плодотворного творчества!
    Вопрос вот в чем, то что я получил вызывая функцию read_upd_struct мне нужно использовать все время работы устройства. При вызове данную функцию повторно, хочу как бы обновить массив данных. Для этого я сначала удаляю весь созданный динамически массив, а потом его снова создаю. Вроде утечек памяти я пока не наблюдаю. Вот мне бы хотелось спросить у знающих людей позволительно ли использования такого способа или же подход неграмотный, по хорошему надо как-то по другому?

    Код (C++):
    struct Memory
    {
      ...
    };
    Memory *arr;
    int n_arr=0

    void setup()
    {
      ...
      read_upd_struct(arr,n_arr);
    }

    void read_upd_struct(Memory *&arr, int &n_arr)
    {
      n_arr=0;
      ...
      free(arr);
      arr=(Memory*)malloc(n_arr*sizeof(Memory));
      ...
    };
     
  2. Daniil

    Daniil Гуру

    имхо
    мне кажется, что это и есть правильный путь.
    Только в коде зачем обнуляется n_arr?
    Проблема, может быть, возникнет когда переменные по памяти распределятся так, что уже не будет подряд n_arr свободных ячеек. (или это надуманная проблема?)
     
    bigory нравится это.
  3. bigory

    bigory Нерд

    n-arr - это счетчик. Он считает кол-во считанных блоков.
    Я в курсе о проблеме, которая может возникнуть с памятью, я это в коде учитываю.
    Спасибо!
     
  4. parovoZZ

    parovoZZ Гуру

    Если это будет использоваться в МК без ОС, то подход неграмотный, ибо память там можно занять и никому больше не отдавать. Она все равно никому не нужна.
     
  5. SavvaRem

    SavvaRem Гик

    Приветствую, рекомендую ознакомиться со стандартом написания безопасного кода для встраеваемых систем MISRA-C, в нем категорически запрещается использование динамически выделяемой памяти. Как по мне, так очень разумное решение, что бы потом не гадать на каком моменте работы приложения, массив затер другие данные. Лучше сразу создайте статический массив достаточного размера