Вопрос

Это нормально делать в с?

int *i;
// do stuff

i = NULL;

i = (int *) some_func();
// do stuff

if (i != NULL)
    free(i);

i = NULL;

// do stuff
i = (int *) some_func();
// do stuff
if (i != NULL)
    free(i);

i = NULL;
Это было полезно?

Решение

1) Это зависит от вашего контракта с some_func (). Если some_func ожидает, что вы вызовете free () для его возвращаемого значения, ваш код в порядке.

2) Это нормально, хотя и не очень элегантно, повторно использовать переменные в C. Как правило, лучше использовать разные переменные для разных целей. С точки зрения производительности и использования mem это одно и то же.

Другие советы

Это зависит от того, что делает some_func () . Если он выделяет память с помощью malloc () , тогда вы должны free () сделать это, когда закончите. Если это не так, то не стоит. Обратитесь к документации функции, чтобы быть уверенным.

Я бы второй ответ Эдгара, но также обратите внимание, что тест для NULL здесь не требуется:

if (i != NULL)
    free(i);

потому что свободен (NULL) разрешен.

Ваш код выглядит нормально - о каком конкретном бите вы спрашиваете? Но обратите внимание, что если функция возвращает int *, нет необходимости в приведении, и если это не так, вам, вероятно, не следует назначать его для int *.

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

Если some_func возвращает указатель, который указывает на динамически выделенную память, да.

Это нормально, пока some_func () делает то, что должен делать. Если он назначит неверный (нераспределенный) адрес i, это приведет к аварийному завершению работы вашей программы.

Зависит от контракта some_func ().

Если some_func () выделяет некоторую память и назначает вашу ответственность за ее освобождение, тогда да, это нормально - освободить ее (). На самом деле, это не ошибка.

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

Если some_func () " владеет " его данные и возвращает только указатели на него для вас, вы не должны освобождать его. Если он malloc предназначен только для вас, то вы действительно несете ответственность за выполнение free

На первом этапе

int *i;
// do stuff

i = NULL;

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

Например:

int *i;
i = (int*) malloc(sizeof(int);
i = NULL;

оставит часть памяти размером с int, оставленную в эфире.

То же самое верно для ваших примеров some_func (), но я думаю, что вы тестируете правильно, пытаясь освободить то, что осталось от some_func (). Особенно, если вы не знаете, как работает some_func ().

Если some_func () из библиотеки, может быть функция free_some_func (i), которая сделает эту работу за вас.

  

i = (int *) some_func ();

Вы не сказали тип возвращаемого значения some_func () , но часть (int *) немного подозрительна. C, как правило, довольно снисходительно относится к этим вещам и обычно компилируется чисто без необходимости явного приведения. Если этого не произойдет, тщательно продумайте, является ли то, что вы делаете, настолько четким и переносимым, каким вы хотите.

@ Кевин Монтроуз: Хммм. Да, требование, чтобы программисты были компетентными, действительно нарушает условия сделки. Может быть, нам всем следует носить шлемы, пока мы снимаем код, на случай, если потолок упадет. И что такое «контракт»? из some_func ? some_func либо возвращает значение, подходящее для передачи на бесплатный, либо нет. Нет "контракта" там. Но тогда, я старый пердун, и не верю в запутанность, чтобы выиграть очки брауни с руководством. Это простые понятия.

@caf: это, вероятно, зависит от компилятора / библиотеки. Безопаснее проверить, как он. То, что ваша реализация бесплатных проверок для указателя NULL не означает, что они все делают.

Если вы имеете в виду, можно ли повторно использовать указатель int вместо объявления нового при каждом использовании, убедитесь, что он в порядке, но в целом это может сбить с толку, если все ваши // do вещи состоят много кода. Другой программист может запутаться, откуда взялся * i и почему это означает X здесь и Y там.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top