ISO/IEC TS 17961 [xfree]

Перераспределение или освобождение памяти, которая не была динамически выделена

Описание

Управляйте определением

Перераспределение или освобождение памяти, которая не была динамически выделена. [1]

Примеры

развернуть все

Описание

Недопустимый свободный от указателя происходит, когда блок памяти выпущенное использование функции free не был ранее выделен с помощью malloc, calloc или realloc.

Риск

Функция free выпускает блок памяти, выделенной на куче. При попытке получить доступ к местоположению на куче, которую вы не выделили ранее, отказ сегментации может произойти.

Проблема может подсветить ошибки кодирования. Например, вы, возможно, хотели использовать функцию free или предыдущую функцию malloc на различном указателе.

Фиксация

В большинстве случаев можно устранить проблему путем удаления оператора free. Если указатель не является выделенной памятью от кучи с malloc или calloc, вы не должны освобождать указатель. Можно просто снова использовать указатель как требуется.

Если проблема подсвечивает ошибку кодирования, такую как использование free или malloc на неправильном указателе, исправьте ошибку.

Если проблема происходит, потому что вы используете функцию free, чтобы освободить память выделенный с оператором new, заменяете функцию free на оператор delete.

Пример - недопустимый свободный от ошибки указателя

#include <stdlib.h>

void Assign_Ones(void) 
{
  int p[10];
  for(int i=0;i<10;i++)
     *(p+i)=1; 
 
  free(p);   
  /* Defect: p does not point to dynamically allocated memory */
}

Указатель p освобожден с помощью функции free. Однако p указывает на ячейку памяти, которая не была динамически выделена.

Исправление — удаляет освобождение указателя

Если число элементов массива, p известен во время компиляции, одно возможное исправление, должно удалить освобождение указателя p.

#include <stdlib.h>

void Assign_Ones(void)
 {
  int p[10];
  for(int i=0;i<10;i++)
     *(p+i)=1;   
  /* Fix: Remove deallocation of p */
 }

Исправление — вводит выделение указателя

Если число элементов массива, p не известен во время компиляции, одно возможное исправление, должно динамически выделить память массиву p.

#include <stdlib.h>

void Assign_Ones(int num) 
{
  int *p;
  /* Fix: Allocate memory dynamically to p */
  p=(int*) calloc(10,sizeof(int)); 
  for(int i=0;i<10;i++)
     *(p+i)=1; 
  free(p); 
}

Проверяйте информацию

Разрешимость: неразрешимый

Введенный в R2019a


[1]  Выписки из стандарта "Техническая характеристика ISO/IEC TS 17961 - 2013-11-15" воспроизводятся с соглашением о AFNOR. Только исходный и полный текст стандарта, как опубликовано Выпусками AFNOR - доступный через веб-сайт www.boutique.afnor.org - имеет нормативное значение.