c бесплатным вопросом - PullRequest
0 голосов
/ 29 июля 2009

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

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;

Ответы [ 13 ]

6 голосов
/ 29 июля 2009

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

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

3 голосов
/ 29 июля 2009

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

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

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

3 голосов
/ 29 июля 2009

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

2 голосов
/ 29 июля 2009

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

1 голос
/ 29 июля 2009

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

0 голосов
/ 29 июля 2009

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

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

0 голосов
/ 29 июля 2009

i = (int *) some_func();

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

0 голосов
/ 29 июля 2009

На вашем первом шаге

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), которая сделает эту работу за вас.

0 голосов
/ 29 июля 2009

Если some_func() «владеет» своими данными и возвращает только указатели на них для проверки, вы не должны освобождать их. Если это malloc s дата только для вас, то вы действительно несете ответственность за выполнение free

0 голосов
/ 29 июля 2009

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

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

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

...