2016-06-17 5 views
-2

Итак, вопрос заключается в том, как оригинальный разработчик предотвращает ситуацию, когда пользователь/новый разработчик пытается получить доступ к элементу памяти .Как предотвратить неопределенное поведение, с точки зрения пользователя/нового разработчика?

int *num=(int *)malloc(n*sizeof(int)); 
int i; 
for(i=0;i<n;i++) 
{ 
scanf("%d",&num[i]);   
}  

for(i=0;i<n-1;i++){ 
temp = some_function(x);   
} 

free(num); 

for(i=0;i<n;i++) 
{ 
    printf("\nnum[%d]= %d\n",i,num[i]);   
} 

P.S .: Приведенный выше код работает и фактически распечатывает данные в массиве. Это не наше намерение. [EDIT] Извините, если я не был достаточно ясен. Кто-то предложил задать этот вопрос как отдельный вопрос, я подумал, почему нет. Вот original post

+1

_Данный код работает и фактически распечатывает данные в array._ .. добро пожаловать в UB. –

+1

[Пожалуйста, просмотрите эту дискуссию о том, почему бы не использовать возвращаемое значение 'malloc()' и family в 'C'.] (Http://stackoverflow.com/q/605845/2173917). –

+0

Код работает на одной конкретной платформе, возможно, в сборке отладки. Запуск этого может привести к сбою в работе другой системы (или сборки релиза). это зависит от распределителя памяти. Некоторые распределители будут нулевыми (или установят все байты на что-то еще) после бесплатного, так что тогда вы получите разные результаты. – Neil

ответ

4

Тот факт, что ваш код «работает» является проявлением неопределенного поведения, что вы испытываете, когда не чтение памяти, что вы больше не принадлежите.

Вы могли рассмотреть возможность num к NULL после первого free вызова. Тогда запись num[i] почти наверняка приведет к краху программы. Иногда это также может быть полезно: free, вызываемый с NULL, переданный как указатель, не является оператором.

К сожалению, еще мало чего можно сделать.

Но, вообще говоря, установка free d указателей на NULL приводит к небрежному программированию, поэтому я стараюсь избегать его.

1

Первое, что вы можете сделать, это установить num = NULL.

В общем, вы можете добавить крючок malloc для записи мусора в память перед освобождением памяти (возможно, только отладки). Это приведет к сбою, если память содержит указатели или мусор печати в этом случае при доступе к свободной памяти.

Также, поскольку вы говорите на C++, используйте умные указатели.

Редактировать: исправлена ​​ошибка.

+0

Как значения мусора превысят программу больше, чем значения уже есть? – 4386427

+0

@ 4386427 Это может не привести к сбою программы, но это предотвратит доступ к исходным данным, что облегчит определение ошибки. –

+0

Извините, думал о более общем случае, когда в памяти содержались указатели. – doron

Смежные вопросы