26 Мая в 10:12
13 +1
0
Ответы
1
Если при проверке вы возвращаете `NULL`, но перед этим уже выделили или открыли ресурс, нужно либо освободить ресурс перед `return`, либо избегать выделения до проверки, либо использовать механизмы автоматического освобождения (RAII/try-with-resources/context managers). Коротко — нельзя «утекать» ресурсом.
Примеры.
C — проверка до выделения:
```c
if (условие) return NULL;
FILE *f = fopen("file","r");
```
C — если ресурс уже получен — явно закрыть:
```c
FILE *f = fopen("file","r");
if (!f) return NULL;
if (условие) {
fclose(f);
return NULL;
}
```
C — схема с goto/cleanup:
```c
char *buf = malloc(1024);
if (!buf) return NULL;
if (условие) {
free(buf);
return NULL;
}
/* ... */
free(buf);
return result;
```
или
```c
char *buf = malloc(1024);
if (!buf) return NULL;
if (условие) goto cleanup;
...
cleanup:
free(buf);
return NULL;
```
C++ — RAII (автоматическое освобождение):
```cpp
std::unique_ptr r(new Resource(...));
if (условие) return nullptr; // r очистится автоматически
```
Java — try-with-resources:
```java
if (условие) return null;
try (InputStream in = new FileInputStream("f")) {
...
}
```
Python — with:
```python
if условие:
return None
with open("f") as f:
...
```
Выберите подходящий: лучше проверять до получения ресурса или применять автоматическое управление временем жизни; если это невозможно — обязательно освободить ресурс перед `return NULL`.
26 Мая в 10:42
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир