динамическое выделение памяти и свободное в C - PullRequest
2 голосов
/ 02 марта 2011

Допустим, я динамически создал строку в программе

char* s = malloc(sizeof(char) * 128);

прежде чем мы начнем использовать s, Как проверить, выделена ли память или нет?

free(s);

И перед использованием free () я хочу проверить, есть ли другие указатели, указывающие на s.

Ответы [ 3 ]

7 голосов
/ 02 марта 2011

malloc() возвращает указатель на вновь выделенную память или NULL.

Поэтому проверьте NULL

char *s = malloc(128); /* sizeof (char), by definition, is 1 */
if (s == NULL) {
    /* no memory allocated */
} else {
    /* use memory */
    free(s);
}

Существуют другие указатели, указывающие, куда указывает s, только если вы(программист) создал их.

1 голос
/ 02 марта 2011

А перед использованием free () хочу проверьте есть ли другие указатели указывая на с.

В общем, вы не можете этого сделать - вы должны управлять тем, что все остальные указатели делают сами.

Один общий помощник - установить 's' в NULL после его освобождения, тогда вы можете по крайней мере определить, используется ли 's' в других ваших функциях, но вы не можете автоматически проверять наличие каких-либо копий .

0 голосов
/ 02 марта 2011

В спецификации malloc говорится, что при ошибке он вернет NULL. Так что если malloc не возвращает NULL, то вы можете зависеть от того, какой объем памяти выделен компилятору. И, к сожалению, не существует стандартного способа определить, указывает ли другой указатель на ту же память. Поэтому перед free вы должны быть программистом, чтобы убедиться, что память не требуется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...