ПроблемаНедопустимое значение без указателя возникает, когда блок памяти, освобожденный с помощью free
функция не была ранее выделена с помощью malloc
, calloc
, или realloc
.
РискThe 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);
}