Имеет ли смысл использовать free () для указателя, который уже имеет NULL? [Дубликат]

Вы можете установить height:8px на первый и второй tr. И удалите среднюю границу из пустых ячеек в последнем tr.

.t-table {
  border: 1px solid black;
  height: 400px;
  border-collapse: collapse;
}
.t-table td {
  border: 1px solid black;
}
.t-table td:empty {
  border-left: 0;
  border-right: 0;
}
<table class="t-table">
  <tr style="line-height: 8px; height: 8px;">
    <td>A</td>
    <td>B</td>
  </tr>
  <tr style="line-height: 8px; height: 8px;">
    <td>1</td>
    <td>2</td>
  </tr>
  <tr>
    <td></td>
    <td></td>
  </tr>
</table>

34
задан Jonathan Leffler 11 March 2010 в 15:15
поделиться

7 ответов

Из раздела C99 7.20.3.2: Свободная функция

Сводка

 1 #include <stdlib.h>
   void free(void *ptr);

Описание

2 Свободная функция заставляет пространство указывать чтобы ptr был освобожден, то есть был предоставлен для дальнейшего распределения. Если ptr является нулевым указателем, никаких действий не происходит .

53
ответ дан Prasoon Saurav 20 August 2018 в 12:28
поделиться

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

Каждая память malloc'd должна быть освобождена один раз. Период.

1
ответ дан amit_grepclub 20 August 2018 в 12:28
поделиться
  • 1
    Доступ к общим данным в многопоточных приложениях должен быть защищен, что предотвратит утечку памяти, которую вы описываете. – outis 1 March 2010 в 10:07
  • 2
    @outis Проблема заключается не в утечке памяти, а в удалении данных, которые ожидают другие потоки (возможно, это приведет к ошибке сегментации). В этом случае защищенного доступа недостаточно. – amit_grepclub 1 March 2010 в 11:50
  • 3
    То, что вы упоминаете про потоки, кажется правильным, но, насколько я могу судить, не относится к этому вопросу, и вы не пытаетесь ответить на этот вопрос. – user 3 March 2010 в 06:43
  • 4
    @Roger Это определенно "относится к вопросу & quot; так как он говорит о дурной привычке. Создание тех же точек, которые сделали другие, не стоит, а другие уже «правильно». ответил на вопрос. – amit_grepclub 3 March 2010 в 11:31

Что происходит внутри памяти, если мы попытаемся освободить указатель, указывающий на NULL.

Ничего.

почему он не показывает никаких сообщений об ошибках / ошибках?

Во-первых, поведение действительно по определению, поэтому никакая ошибка или предупреждение не должны быть выданы.

Во-вторых, указатель указывает на NULL во время выполнения. Как отображать предупреждение или сообщение об ошибке, если вообще? Представьте, что вы играете в игру под названием Kill the Zombie, и пока двое из этих существ атакуют вас, появляется сообщение об ошибке всплывающего окна, в котором говорится: «Предупреждение, указатель NULL освобожден».

3
ответ дан Daniel Daranas 20 August 2018 в 12:28
поделиться
  • 1
    Какой у вас там смысл? Этот пример напоминает мне из окон и не имеет ничего общего с протоколированием сообщений об ошибках. Разумное решение для предупреждения - вывести их в stderr. – Cheery 1 March 2010 в 10:14
  • 2
    Моя точка зрения была четко сформулирована. «Предупреждение» (только полезный для программиста) будет мешать нормальному выходу программы. – Daniel Daranas 1 March 2010 в 10:36
  • 3
    О, он спросил, почему это не show . :) Виноват. Это странный вопрос, почти ничего на C не показывает никаких предупреждений или ошибок, если программист не проверял ошибку. – Cheery 2 March 2010 в 21:05

Я бы пошел за:

#ifdef MY_DOUBTS_HAUNT_ME_IN_MY_DREAMS
    #define safe_free(x) do { if ((x)) free((x)); } while(0)
#elseif /* feeling gutsy */
    #define safe_free(x) free((x))
#endif

; - ||

5
ответ дан edgar.holleis 20 August 2018 в 12:28
поделиться
  • 1
    прежде всего, вы, вероятно, имеете в виду «safe_free». но в чем смысл этого. free(NULL) является совершенно законным. Нет смысла проверять NULL до free. – Evan Teran 2 March 2010 в 08:02
  • 2
    Разве вы не можете узнать анекдот (даже если написано плохо)? – edgar.holleis 2 March 2010 в 14:10
  • 3
    Шутки в отдельности, Kamailio-SIP-сервер kamailio.org , с включенными предупреждениями, регистрирует предупреждение, когда вы освобождаете (0). – edgar.holleis 2 March 2010 в 14:13
  • 4
    Я понимаю вашу точку со всем этим - пока я думаю, что если (0); else free ((x)); выглядит лучше – Hayri Uğur Koltuk 14 March 2012 в 16:05

Когда-то очень давно существовали реализации «free ()», которые разбились, когда получили пустой указатель на свободный. Это применимо только к реализациям, которые предваряют стандарт C89 (C90), который не был изменен для решения проблемы с тех пор.

По моему опыту, по существу, ни одна из этих реализаций не оставлена ​​(и не должна есть), поэтому теперь безопасно освобождать нулевые указатели.

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

5
ответ дан Jonathan Leffler 20 August 2018 в 12:28
поделиться

Из http://linux.die.net/man/3/malloc :

Если ptr равно NULL, операция не выполняется.

15
ответ дан Martin B 20 August 2018 в 12:28
поделиться
  • 1
    Для тех, кто боится, что это расширение Linux, это поведение гарантируется стандартом C90. – AProgrammer 1 March 2010 в 09:56
  • 2
    Интересно отметить, что люди, написавшие эту страницу Linux, либо не понимали, либо не интересовались различием между NULL и «нулевым значением указателя». Большинство серьезных и / или официальных документов обычно довольно педантичны (см. Другие ответы). – AnT 2 March 2010 в 07:47

освобождение нулевого указателя не повлияет на выполнение.

6
ответ дан Pavunkumar 20 August 2018 в 12:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: