функция free () без malloc или calloc - PullRequest
4 голосов
/ 06 ноября 2010

быстрый вопрос

Можете ли вы использовать функцию free () без предварительного вызова malloc ??

ei.

void someFunc( void )
{
   char str[6] = {"Hello"};

   //some processing here ....

   free(str);
}

Я не получаю ошибок компиляции, но это работает или это правильно?

Спасибо,

Ответы [ 5 ]

10 голосов
/ 06 ноября 2010

Это не совсем правильно:

  1. Вы не можете освободить статический массив, такой как char str[6].
  2. free () должен вызываться только в выделенной памяти (илина NULL).
5 голосов
/ 06 ноября 2010

Когда вы вызываете malloc () или любую другую функцию выделения, память будет выделяться на heap . Это единственное воспоминание, которое можно освободить. Когда вы объявляете статическую строку, как вы сделали в своем примере, строка выделяется во время компиляции в другом сегменте памяти. То же самое относится и к самому указателю str, который расположен в стеке и, следовательно, не может быть освобожден либо.

3 голосов
/ 06 ноября 2010

Использование free для переменной, отличной от malloc, обычно приводит к Segfault Пример:

#include <stdlib.h>

int main()
{
  char str[6] = {"Hello"};
  free(str);
}

$ gcc test.c -o test

$ ./test

Ошибка сегментации

2 голосов
/ 06 ноября 2010

free () использует данные, добавленные к выделенному блоку, для управления кучей.Если указанная память не была выделена функцией выделения кучи, такой как malloc () или calloc (), то данные, предшествующие блоку, будут бессмысленными в качестве данных управления кучей.

Некоторые библиотеки обнаруживают недопустимые данные кучи и выдают ошибку времени выполнения, в противном случае поведение не определено.Часто последствия такой ошибки остаются незамеченными до тех пор, пока вы не попытаетесь выделить дополнительную память.Это может сделать отладку таких ошибок очень сложной.

Вы не получите ошибку компилятора, поскольку она не является синтаксической ошибкой и не обнаруживается во время компиляции.Компилятор не знает семантики библиотечных функций.Все, что он знает, это то, что malloc () возвращает void *, а free () принимает void *;во время компиляции невозможно узнать, ссылается ли указатель на динамически распределенный блок, поскольку память по определению выделяется во время выполнения.Также указатель может быть изменен во время выполнения, чтобы указывать на любой тип памяти, или может быть псевдонимом - скопирован в другой указатель и затем свободен через второй указатель.Вы ожидаете много компилятора, если вы ожидаете сообщение об ошибке;однако некоторые инструменты статического анализа могут предупреждать о возникновении такой ошибки, а инструменты динамического анализа, такие как valgrind, могут обнаруживать ошибку, когда и если она действительно возникает во время тестирования.

0 голосов
/ 06 ноября 2010

Нет


Функция free(3) принимает параметр void *, так что вы можете передать ему любой указатель без ошибки времени компиляции.Но плохие вещи произойдут, если указатель не был изначально возвращен malloc(3) и никогда ранее не возвращался free(3).

...