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

Стратегия "получение ресурса есть инициализация" - 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++ Игровая программа ипподром"
Добрый день, помогите пожалуйста: Необходимо создать игру "Ипподром". Я сделал в консоле что мог, не могу заставить своих "сосисочек" бегать вместе, но с разной скоростью. Получается что они бегут либо в месте, либо сперва бежит одна, а потом вторая.. помогите реализовать совместный бег "сосисок", но с разной скоростью! // ippodrom.cpp: определяет точку входа для консольного приложения. // ...
C++ Работа с указателями http://www.cyberforum.ru/cpp-beginners/thread837193.html
Помогите пожалуйста объяснить, не понимаю почему число присваемое через указатель *А в кавычках, и равны ли *А и просто А??? char *A = "123456789"; unsigned B = 1; char *X = A + B; char *Y = A - (-B); Не используя, компилятор дать ответ равны или нет будут значения X и Y. Объяснить свой ответ.
C++ ошибка в задаче на палиндром Ребят помогите пожалуйста. Задачка найти палиндром в массиве. Писал-писал и в итоге в ф-ии последнее условие if (arr_t1==arr_t2) постоянно выводит ложь, не понимаю, почему оно мне врет((( //Дан целочисленный массив от 0..N и //необходимо найти самый длинный палиндром в массиве #include <iostream> #include <conio.h> const int n = 10; подробнее

Показать сообщение отдельно
DrOffset
6460 / 3834 / 885
Регистрация: 30.01.2014
Сообщений: 6,629
28.06.2014, 04:56     Стратегия "получение ресурса есть инициализация"
TheChosenOne, в этом случае деструктор ~С все равно не вызовется. А вот деструкторы A и B вызываются при выходе из class scope, в даном случае по исключению, a и b автоматические объекты по отношению к class scope. См. мое пояснение выше.

В общем, чтобы расставить все точки над i, приведу цитату:
15.2/1
As control passes from a throw-expression to a handler, destructors are invoked for all automatic objects
constructed since the try block was entered.
Т.е. вот есть try блок, не важно где, в main, например:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void boo()
{ //scope 2
    C c; // scope 2.1
}
 
void foo()
{ //scope 1
    D d; //scope 1.1
    boo();
}
 
int main()
{
    try
    { //scope 0
        foo();
    }
    catch(...)
    {
    }
}
Далее следует череда вызовов, каждый из которых создает scope. scope 0 контролирует scope 1, scope 1 контролирует scope 2 и scope 1.1 (class scope), scope 2 контролирует scope 2.1. В штатном режиме деструкторы вызываются в конце scope. Class scope не совсем обычный scope (поэтому я его опустил в первом примере, но теперь думаю, что зря), отличается он тем, что в штатном режиме для автоматических объектов класса он завершается вместе с деструктором этого класса*. В остальном все точно так же как с обычным scope. Предположим конструктор С у нас генерирует исключение. Исключение - это выход из scope, значит деструкторы автоматических объектов принадлежащих этому scope должны быть вызваны. Что и происходит. Смотрим цитату из стандарта выше "destructors are invoked for all automatic objects constructed since the try block was entered". Это и есть раскрутка стека. Т.е. процесс прохода по всем вложенным scope начиная с самого глубокого и заканчивая try-блоком, и вызов деструкторов уже созданных в этих scope автоматических объектов. Теперь я думаю очевидно, что этому механизму вообще по барабану где находился объект (часть другого объекта или отдельно), главное то, что он а) автоматический и б) принадлежит одной из scope задействованных в раскрутке.

_________________
*На самом деле я встречал в IT такой же подход и к scope функций. У каждой функции есть как бы конструктор (pre function) и деструктор (post function). Но в С++ не так, в С++ функции - не объекты и поэтому такое поведение присуще только объектам классов (да это не последовательно и не очень логично, но помним про историю и про обратную совместимость с С).

Добавлено через 17 минут
И да, забыл добавить. Деструкторы вызываются в момент раскрутки. Будет ли этот вызов в конце каждого из участвующих scope или они пройдут разом в самом конце, при переходе к catch - зависит от реализации модели исключений в компиляторе. Поэтому говорить, что именно конструктор вызывает деструкторы уже созданных подобъектов - некорректно, на SOF ошиблись или дали неполный ответ.
 
Текущее время: 03:21. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru