Nano Hash - криптовалюты, майнинг, программирование

Освобождает ли free() память на всех глубинах или только на самом высоком уровне?

Предположим, у меня есть структура, определенная таким образом:

struct myStruct{
    data* anotherStruct;
}

Предположим, я выделяю память в куче для структуры типа myStruct. Указатель на эту структуру называется ptr. Затем я звоню free(ptr). Освобождает ли это память, выделенную только для myStruct, или память, выделенную для myStruct и anotherStruct?

Если он освобождает только память, выделенную для myStruct, приведет ли это к утечке памяти, потому что нет указателя на anotherStruct и его никогда нельзя освободить?


Ответы:


1

Он освобождает только память, выделенную для этого адреса. то есть: Да, самый высокий уровень.

Освобождается ли при этом память, выделенная только для myStruct, или память, выделенная для myStruct и anotherStruct?

Он освобождает только память, выделенную для myStruct.

Если он освобождает только память, выделенную для myStruct, приведет ли это к утечке памяти, потому что нет указателя на anotherStruct и его невозможно освободить?

Если у вас нет указателя на anotherStruct, тогда да, происходит утечка памяти. Обычная стратегия заключается в освобождении памяти в порядке, обратном порядку, в котором вы ее выделили.

Например: в вашем случае вы сначала выделили myStruct, а затем anotherStruct, поэтому вы должны освободить в точно обратном порядке, то есть: сначала освободить anotherStruct, а затем myStruct.

07.12.2012

2

Только высший уровень. Это не так умно.

07.12.2012
  • Добро пожаловать в СО! Спасибо за Ваш ответ. Больше контекста не помешало бы. 07.12.2012

  • 3

    В коде

    struct myStruct *ptr = malloc(sizeof(myStruct));
    .
    .
    .
    free(ptr);
    

    ничего из показанного не повлияло на anotherStruct члена *ptr, ptr->anotherStruct. Вероятно, вы захотите использовать malloc, чтобы указать ptr->anotherStruct на полезный блок памяти. Затем вам нужно будет вызвать free(ptr->anotherStruct) перед вызовом free(ptr), чтобы избежать утечек памяти.

    Может быть весьма полезно определить функции инициализации и уничтожения, чтобы автоматически обрабатывать такое «внутреннее (де)распределение».

    07.12.2012

    4

    «free» может освободить только память, выделенную на самом высоком уровне. Простая причина в том, что для элементов-указателей внутри структуры вы можете или не можете выделять память из кучи. Как free сможет отслеживать, откуда взялась вся память члена указателя?

    07.12.2012

    5

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

    07.12.2012

    6

    Адрес — это ключ для освобождения памяти. каждая malloc() возвращенная память является отдельным ключом. поэтому верхний блок (т.е. память, выделенная для типа myStruct) только освобождается и приводит к утечке памяти.

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

    07.12.2012

    7

    Да, как все говорили, он освободит память, выделенную только для структуры, а НЕ для того, на что указывает otherStruct. это, безусловно, приведет к утечке памяти. ответственность за освобождение памяти, выделенной динамически, лежит на программистах.

    вы можете использовать инструмент "valgrind" для проверки утечки памяти.

    07.12.2012
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..