Библиотека MemoryFree, демонстрирующая нестандартное поведение..!

Я просто сжег код, написанный ниже, но он показывает мне нестандартное поведение.. как в последнем абзаце вывода, свободная память увеличивается после выделения во время выполнения, как это возможно? Вывод прилагается:

#include <MemoryFree.h>
String str="rajat";
int flag=0;
void setup() 
{
  // поместите сюда ваш код настройки для однократного запуска:

  Serial.begin(9600); Serial.println(freeMemory(), DEC);  // выводим объем доступной оперативной памяти.
  Serial.println("Lets Start");
}

void loop() 
{
    Serial.println("");
    Serial.println("Rajat0");
    Serial.println(freeMemory(), DEC);
    Serial.println("Rajat1");
    str=str+"rjt";
    Serial.println(str);
    Serial.println("Rajat2");
    Serial.println(freeMemory(), DEC);
    Serial.println("Rajat3");
    Serial.println("");
      delay(1000);      
}

, 👍0


1 ответ


1

Свободная память может быть найдена в двух формах:

  • Свободное пространство между кучей и стеком. Обычно это основная часть свободной памяти.
  • «Дыры» в куче, т.е. участки нераспределенной памяти внутри кучи. Наличие этих дыр называется «фрагментацией кучи».

Существуют различные версии библиотеки MemoryFree. Самые простые из них сообщать только основной кусок между кучей и стеком. Чем больше сложные просматривают список свободных ресурсов malloc(), чтобы также посчитать кучи дыр. Какой подход лучше? Я бы сказал, что наивный версия хороша, так как куча дыр — это то, на что не стоит рассчитывать, потому что никогда не гарантируется, что определенное распределение будет соответствовать любую из этих дыр.

Вы явно используете одну из наивных версий. По мере того, как вы растете строка, объект вызывает realloc(), который в некоторых случаях копирует массив символов строки и освобождает исходный, потенциально создавая дыру в куче. В конце концов, небольшие дыры могут объединиться в большего размера достаточно большого для следующего распределения, и realloc() может в конечном итоге использовать эту большую дыру и освободить кусок памяти вершина кучи. Когда это происходит, куча сжимается, и основная кусок свободной памяти становится больше, что и есть freeMemory() отчитываюсь перед вами.

Вкратце, это нормальное и ожидаемое поведение. Если вы хотите что-то менее удивительно, используйте версию библиотеки, которая подсчитывает отверстия. Но тогда вы можете столкнуться с более неприятным сюрпризом: кучей-стопкой Столкновение или нехватка памяти могут произойти даже при большом количестве память, зарытая в кучных ямах.

,