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

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

Восстановить пароль Регистрация
Другие темы раздела
C++ Среда программирования для Windows 7 http://www.cyberforum.ru/cpp-beginners/thread811508.html
Подскажите пожалуйста какую лучше всего среду разработки установить для операционной системы Windows 7 домашняя базовая 32 разрядная? Установил Visual Studio 2005, эта среда не всегда хорошо работает бывало после нажатия кнопок Build Solution и Start without debuggin вылетает окно Прекращена работа программы LetAp.exe и далее окно Программа LetAp.exe не работает. Подскажите в чём может быть...
C++ make_pair Уважаемые форумчане, как написать функцию, которая на вход принимает make_pair? Вызывать буду так: func( std::make_pair(2, 3) ); http://www.cyberforum.ru/cpp-beginners/thread811492.html
__asm вставки (процессор Pentium) C++
Пишу в вижуал Студии, делаю ассемблерные вставки, хочу вызывать си-процедуру, в которой тоже ассемблер - просто поменять значение одного регистра, не хочу никаких стеков, ОЗУ и прочего. При выходе похоже не восстанавливается из стека адрес возврата и программа вылетает. Подскажите, где ошибка? (Лишние куски кода убрал для краткости) unsigned char expand_CL(void) { //unsigned char y; __asm{...
Генерация случайного числа больше нуля, но меньше единицы C++
Всем привет. Подскажите, как можно генерировать псевдослучайное число больше нуля, но меньше единицы. При этом количество цифр после точки должно быть от 16 до 18 включительно. Заранее всем спасибо.
C++ Исправить ошибки в связном списке http://www.cyberforum.ru/cpp-beginners/thread811474.html
Почти готовая лабораторка, но не хватает несколько деталей. Помогите решить проблему, пожалуйста! Задание : 1. Создание списка из файла. 2.Insert <елемент> n Вставка елемента в позицию n. 3. DELETE N Удаление елемента з N позиции. 4.CHANGE M N – Смена елементов M N . 5.DUMP Вывод в конечный файл . Все работает, но когда открываю текстовый файл со списком или отчетом, вместо элементов...
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?
Причина - количество указателей, ссылающихся на данный объект, компилятору неизвестно. Можно занулить данный указатель, но как быть со всеми остальными? Поэтому - дело за вами, как говорит один из корифеев данного форума - "поработайте ручками" )
Миниатюры
Конструктор класса  
 
Текущее время: 08:38. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru