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

Стратегия "получение ресурса есть инициализация" - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Непонятки с wchar_t http://www.cyberforum.ru/cpp-beginners/thread837244.html
Прошу помощи: что-то не так с wchar_t. Не копирует имена файлов. Содержание program_config.txt config.cfg C:\\Projects\\abx.txt static wchar_t* charToWChar(const char* text)
C++ Ошибка ms vs c++ rl Здравствуйте! Я хотел запустить прогу мою на другом компе и мне выскочила такая ошибка. This application has requested the Runtime to terminate it in an unusual way. Библиотеки VS c++ пробовал... http://www.cyberforum.ru/cpp-beginners/thread837234.html
Написать функцию, которая переворачивает строку C++
Написать функцию, которая переворачивает строку. Заголовок функции: void reverseStr (char *s); Написать программу, которая принимает от пользователя набор строк (массив строк), переворачивает все...
C++ Игровая программа ипподром"
Добрый день, помогите пожалуйста: Необходимо создать игру "Ипподром". Я сделал в консоле что мог, не могу заставить своих "сосисочек" бегать вместе, но с разной скоростью. Получается что они бегут...
C++ Работа с указателями http://www.cyberforum.ru/cpp-beginners/thread837193.html
Помогите пожалуйста объяснить, не понимаю почему число присваемое через указатель *А в кавычках, и равны ли *А и просто А??? char *A = "123456789"; unsigned B = 1; char *X = A + B; char *Y = A -...
C++ ошибка в задаче на палиндром Ребят помогите пожалуйста. Задачка найти палиндром в массиве. Писал-писал и в итоге в ф-ии последнее условие if (arr_t1==arr_t2) постоянно выводит ложь, не понимаю, почему оно мне врет((( //Дан... подробнее

Показать сообщение отдельно
TheChosenOne
13 / 13 / 1
Регистрация: 13.09.2013
Сообщений: 113
28.06.2014, 22:47
Цитата Сообщение от DrOffset Посмотреть сообщение
Ни один из деструкторов не вызвался.
Ну,в стандарте написано что независимо от того был ли раскручен стек будет вызвана ф-я terminate(). Страуструп пишет: будут ли вызываться деструкторы зависит от реализации С++.
Цитата Сообщение от DrOffset Посмотреть сообщение
As control passes from a throw-expression to a handler, destructors are invoked for all automatic objects constructed since the try block was entered
Если объект создается динамически,тогда подобъекты явл. динамическими...(где-то встречал в стандарте) Так что этот пункт не совсем подходит. Для недосозданных объектов там же специальный пункт.
15.2/2 С++11
An object of any storage duration whose initialization or destruction is terminated by an exception will
have destructors executed for all of its fully constructed subobjects (excluding the variant members of a
union-like class), that is, for subobjects for which the principal constructor (12.6.2) has completed execution
and the destructor has not yet begun execution.
Цитата Сообщение от DrOffset Посмотреть сообщение
Да, я говорил о времени жизни объекта и о его влиянии на подобъекты.
Ну для того что бы закончилось время жизни объекта,надо что бы оно началось .

Добавлено через 29 минут
Вот тут важно:
Я отследил в отладчике весь путь потока управления. Например пусть ситуация такая: Создаем объект,в котором 2 подобъекта создаются нормально,а в конструкторе 3тьего появляется исключение.Смотрим на стек вызовов ф-й:
C++
1
2
3
4
5
~Obj2(); // Деструктор последнего созданного объекта
//External code
Obj3(); //Конструктор который кинул исключение
Constructor() //конструктор главного обЪекта
Main();
Т.е. поток управления передался сразу из конструктора объекта,который кинул исключение в деструктор уже созданного объекта. Это означает что механизм раскрутки стека еще не начался. Сначала будут удалены все созданные объекты. Хотелось бы подчеркнуть что вызов деструктора трактуется как External т.е внешне генерируемый. Я думаю это как раз означает что компилятор генирирует "внешний" код для удаления созданных объектов в случае исключения И значит он где-то хранит информацию какие подобъекты были уже созданы при вызове конструктора.

Добавлено через 24 минуты
Хах,для локальных объектов,которые полностью созданы вызов такой же. Выходит что компилятор генерирует специальный код всегда когда кидается исключение. При нормальном выходе из области видимости вызов в стеке не помечается как External. Т.е. с областью видимости это не связано,это лишь механизм исключений. Поскольку компилятор знает что нужно вызывать для всех созданных объектов в стеке деструкторы,а лишь затем делать pop() из стека что бы добраться до след. адреса возврата что бы перейти на уровень выше и так до тех пор пока не найдется handler.

Добавлено через 10 минут
External - это внешний код,который генерирует компилятор,а не метка для деструктора (извиняюсь за неточность)

Добавлено через 11 минут
Это можно все приписать к окончанию времени жизни объекта,но объект то создан не был -> его время жизни даже не начиналось. (это я про class scope leaving говорю )
1
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru