Если при проверке вы возвращаете `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`.
Примеры.
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`.