﻿# V2588\. MISRA\. All memory or resources allocated dynamically should be explicitly released\.

This diagnostic rule is based on the [MISRA](https://www.misra.org.uk/) \(Motor Industry Software Reliability Association\) software development standard\.

This rule applies only to C\. The analyzer detected a potential memory or resource leak\. The memory or resource had been allocated with standard library functions, such as: 'malloc', 'calloc', 'realloc', or 'fopen'\.

For example:

```cpp
void foo()
{
  int *a = (int*)malloc(40 * sizeof(int));
  int *b = (int*)malloc(80 * sizeof(int));
  ....
  free(a);
}
```

The code above dynamically allocates two buffers, but when the function exits, only one of them is released\. This creates a memory leak\. 

You can fix the code fragment in the following way:

```cpp
void foo()
{
  int *a = (int*)malloc(40 * sizeof(int));
  int *b = (int*)malloc(80 * sizeof(int));
  ....
  free(a);
  free(b);
}
```

Let's take a look at a different example:

```cpp
void bar(bool b) 
{
  FILE *f = fopen("tmp", "r");
  if (b)
  {
    return;
  }
  ....
  fclose(f);
}
```

The function above opens and reads a file \- and does not close it on one of the exit paths\. This results in a file descriptor leak\. 

Below is the correct code:

```cpp
void bar(bool b) 
{
  FILE *f = fopen("tmp", "r");
  if (b)
  {
    fclose(f);
    return;
  }
  ....
  fclose(f);
}
```