Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

Конструктор класса - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Среда программирования для Windows 7 http://www.cyberforum.ru/cpp-beginners/thread811508.html
Подскажите пожалуйста какую лучше всего среду разработки установить для операционной системы Windows 7 домашняя базовая 32 разрядная? Установил Visual Studio 2005, эта среда не всегда хорошо работает...
C++ make_pair Уважаемые форумчане, как написать функцию, которая на вход принимает make_pair? Вызывать буду так: func( std::make_pair(2, 3) ); http://www.cyberforum.ru/cpp-beginners/thread811492.html
__asm вставки (процессор Pentium) C++
Пишу в вижуал Студии, делаю ассемблерные вставки, хочу вызывать си-процедуру, в которой тоже ассемблер - просто поменять значение одного регистра, не хочу никаких стеков, ОЗУ и прочего. При выходе...
Генерация случайного числа больше нуля, но меньше единицы C++
Всем привет. Подскажите, как можно генерировать псевдослучайное число больше нуля, но меньше единицы. При этом количество цифр после точки должно быть от 16 до 18 включительно. Заранее всем...
C++ Исправить ошибки в связном списке http://www.cyberforum.ru/cpp-beginners/thread811474.html
Почти готовая лабораторка, но не хватает несколько деталей. Помогите решить проблему, пожалуйста! Задание : 1. Создание списка из файла. 2.Insert <елемент> n Вставка елемента в позицию n. 3....
C++ Составить программу с аппроксимацией С пятой задачей помогите. В голову ничего не лезит подробнее

Показать сообщение отдельно
IrineK
Заблокирован
19.03.2013, 07:28
Дискуссия о занулении указателей уже не раз возникала на форуме. Например, здесь: Указатели и сссылки. Надо ли обнулять? когда и как это делать?

При этом высказывания не столь категоричны, как у моих уважаемых оппонентов)
Нисколько не сомневаясь в их компетенции и их выборе, позволю себе описание процессов, происходящих при использовании delete, для более заинтересованной аудитории.

Немного "подрихтуем" последний вариант кода. Создадим функцию для непосредственного вывода объекта в потоке.
Для этого в объявлении класса среди уже имеющихся функций добавим:
C++
1
friend const ostream& operator<<(ostream& stream,const Person& obj);
и опишем ее ниже:
C++
1
2
3
4
5
const ostream& operator<<(ostream&stream,const Person& obj)
{
    stream<<obj.Name<<"\t"<<obj.Surname<<"\t"<<obj.PESEL<<"\n";
    return stream;
}
Теперь, после того, как поиграли с объектом класса, будем его удалять.
Добавим строки:
C++
1
2
3
cout<<"\nBefore delete: "<<&p<<"\t"<<p<<"\t"<<*p;
    delete p;
    cout<<"\nAfter delete: "<<&p<<"\t"<<p<<"\t"<<*p; //здесь попытка вывода *р приведет к крашу
Конечно же, мы вылетаем при попытке обращения к объекту (*р) после delete – взять нечего (память в куче освобождена), но указатель НЕ занулен (р = 0027f92c, он остался в стеке).
Адрес и значение указателя после delete мы по-прежнему получили (см.рис.1)

Объяснение: при удалении адресуемого указателем p объекта с самим указателем p, с его значением ничего не происходит. Оператор delete освобождает память в куче, указатель же p располагается в стеке, отведенная под него память будет освобождена только при выходе p из области видимости. После выполнения delete в ячейках памяти, занимаемых указателем p в стеке, будет записана та же информация — число 0027f92c — адрес уже несуществующего объекта.

Таким образом, после выполнения оператора delete мы получаем недействительный указатель (dangling pointer), указатель, который адресует несуществующий объект. Для обработки исключений вручную имеет смысл сразу после удаления объекта присвоить указателю на него значение NULL, тем самым явно идентифицировав этот указатель как ни на что не указывающий.

Попробуем так (конечно, уже без попыток добраться до *р после delete):
C++
1
2
3
4
5
cout<<"\nBefore delete: "<<&p<<"\t"<<p<<"\t"<<*p;
    delete p;
    cout<<"\nAfter delete: "<<&p<<"\t"<<p;
    p = NULL;
    cout<<"\nAfter delete and NULL: "<<&p<<"\t"<<p;
Результат - на рис.2. Указатель благополучно занулился. Можно обрабатывать, не допуская нежелательных процессов.

Возникает вопрос: почему компилятор автоматически не присваивает ссылке NULL при операции delete?
Причина - количество указателей, ссылающихся на данный объект, компилятору неизвестно. Можно занулить данный указатель, но как быть со всеми остальными? Поэтому - дело за вами, как говорит один из корифеев данного форума - "поработайте ручками" )
0
Миниатюры
Конструктор класса  
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru