Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: глюки gcc  (Прочитано 12746 раз)
0 Пользователей и 2 Гостей смотрят эту тему.
dron
Гость
« : 15-07-2005 14:16 » 

Работая с выделением динамической памяти, наткнулся на такой глюк(либо я чего-то не допонимаю):
free(mass);
for(y=0;y<n;y++){
      printf("%c",mass[y]);
}
вроде должно быть сообщение об ошибке, но он выводит то, что якобы удалилось! Как такое может быть?
Записан
npak
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 15-07-2005 14:47 » 

К gcc это отношения не имеет.  Аллокация/освобождение памяти реализованы в стандартной библиотеке языка Си.

Данный случай означает, что освобождённая память не была возвращена ядру, и процесс по-прежнему имеет доступ к ней.  Когда отдавать освобождённую память -- внутренняя особенность аллокатора.
Записан

UniTesK -- индустриальная технология надежного тестирования.

http://www.unitesk.com/ru/
dron
Гость
« Ответ #2 : 15-07-2005 16:00 » 

И как с этим бороться?
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #3 : 15-07-2005 16:19 » 

dron, надо себя контролировать.
Типичным решением будет обнуление указателя при инициализации и при освобождении памяти.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
dron
Гость
« Ответ #4 : 15-07-2005 16:55 » 

Спасибо.
 Я нашел ещё один выход:
mass=realloc(mass,0);
по эффекту тоже самое.
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #5 : 15-07-2005 19:01 » 

Так ты только сложности создаешь.
Попробуй так:
Код:
#include <stdio.h>
#include <stdlib.h>

#define free(ptr) do { free(ptr); ptr = 0; } while (0)

int main()
{
    char * p = malloc(10);

    printf("Befor: %p\n",p);
    free(p);
    printf("After: %p\n",p);
    return 0;
}
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
dron
Гость
« Ответ #6 : 16-07-2005 10:23 » 

А в чём сложности? Можно поподробнее пожалуйста Улыбаюсь
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #7 : 16-07-2005 11:38 » 

Вот она сложность: realloc(mass,0) вместо free(mass).
Eсли есть простые правила, так не к чему их усложнять - сам запутаешься и других запутаешь.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
dron
Гость
« Ответ #8 : 16-07-2005 11:39 » new

Ок. Спасибо.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines