Массив динамических объектов (динамический массив объектов)))

Тема в разделе "Arduino & Shields", создана пользователем gonzales, 26 янв 2018.

  1. gonzales

    gonzales Гик

    Доброго времени суток!

    Комрады, направьте на путь истинный, как правильно описать динамический массив.

    Я сделал так:

    Есть структура
    Код (C++):
    struct TRule {
    byte SceneID;
    byte ElseSceneID;
    };
    Задаю массив
    Код (C++):
    TRule* Rule[MAX_RULES];
    Когда необходимо создаю элемент в массиве

    Код (C++):
    Rule[RuleID] = new TRule;
    Rule[RuleID]->SceneID = 5;
    Rule[RuleID]->ElseSceneID = 6;
    Когда элемент больше не нужен убиваю его

    Код (C++):
    delete Rule[Index];
    Вроде все законно, но есть проблема, после 2-3 итерации одного и того же элемента массива в пямять на его место записываются другие данные и МК виснет.

    Выяснил это опытным путем, выводя в монитор при создании элемента массива Rule[RuleID]->SceneID. В какой-то момент он перестает быть нулем и я получаю то, что получаю.

    Вопрос собственно один, правильно ли я создаю динамический массив? Делал сам по аналогии с теми примерами, что нашел в инете, но там речь шла про отдельные элементы, а не про массив. (http://mypractic.ru/urok-15-ukazateli-v-c-dlya-arduino-preobrazovanie-ra...)

    Вообще задача у меня следующая
    На SD-карте хранится инфа об объекте в структурированных txt файлах. Я не знаю заранее, сколько объектов в определенный момент времени будет одновременно использоваться, есть только ограничение сверху (заведомо большое, 50). Выделять память под все объекты - пустая трата ресурсов, потому как реально объектов может быть 3 или 5. При этом я должен иметь возможность обратиться к каждому из элементов. Я для удобства использовал структуру и (видимо наивно) полагал, что динамический массив позволит мне выделять память под конкретный объект и затем ее освободить. Но походу delete затирает весь массив, а не отдельный элемент. Как быть в такой ситуации?
     
  2. DIYMan

    DIYMan Guest

    Надо полный код, без него - не скажешь, в чём проблема.
     
  3. AlexU

    AlexU Гуру

    Что за МК используете?
    Правильно, если проверяете, что 'RuleID' и 'Index' всегда меньше 'MAX_RULES'.
    Правильно полагали.
    Нет, delete удаляет конкретный объект. При чём память не очищает, а только помечает, что она (память, участок памяти) больше ни кем не используется.

    Если Вы используете Arduino UNO или подобные платы, то должны понимать, что в Вашем распоряжении всего 2 кБ памяти. Эти 2 кБ имеют свойство очень быстро исчезать, особенно при динамическом выделении/освобождении памяти (есть такая штука как дефрагментация памяти).