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

Вопрос по исключениям в шаблонах классов - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Прошу помочь с программой составления заявок http://www.cyberforum.ru/cpp-beginners/thread317532.html
Здравствуйте! Пожалуй начну о моей проблеме с начала. Работаю в крупной организации, занимаюсь снабжением производства ТМЦ и организацией ремонта изделий. Посредственно знаю PHP на уровне...
C++ Ошибка в класе вектор У меня есть Класс вектор и в нем видает 3 ошибки error C2065: x: необъявленный идентификатор error C2065: y: необъявленный идентификатор error C2065: z: необъявленный идентификатор В перегрузке... http://www.cyberforum.ru/cpp-beginners/thread317523.html
C++ Даны два массива из указателей на строки
Пожалуйста помогите!! Даны два массива из указателей на строки, последний элемент каждого массива равен NULL. Разработать функцию, получающую эти массивы и выводящую все строки, встречающиеся в...
Ошибка в Классе связного списка C++
Пишу связный список в виде класса, но вот только что заметил, из за удаления элемента ( при его добавлении выделяю под него память new-шкой, а удаляю соответсвенно delete ) программа экстренно...
C++ структуры http://www.cyberforum.ru/cpp-beginners/thread317490.html
помогите плиз: Таблица содержит геометрические точки, заданные в полярных координа- тах (a, R) . Определить прямоугольник в плоскости Oxy, в который попадают все указанные точки x = R cos a, y = R...
C++ Используя разложение cos(x) в ряд. Вычислить cos(0.5) Знаю конечно, что наглость, но пожалуйста подскажите как это разложить? Так же в ряд Тейлора или нет? подробнее

Показать сообщение отдельно
ValeryLaptev
Эксперт С++
1041 / 820 / 48
Регистрация: 30.04.2011
Сообщений: 1,659
11.06.2011, 00:12
Вот вам инфа про динамические объекты:

Классы (non-Pod типы)
Любой класс, не удовлетворяющий перечисленным выше условиям , является non-POD типом. Стандарт определяет, что создание динамического non-POD объекта операцией new выполняется в два этапа:
1. Для объекта выделяется необходимое количество свободной памяти.
2. Вызывается конструктор, чтобы проинициализировать выделенную память.

Время жизни динамических non-POD объектов начинается только с момента окончания работы конструктора. Первый шаг для одиночного объекта выполняется функцией выделения памяти operator new(), и функцией operator new[]() — для массива объектов. В стандарте [1 3.7.3, 18.4] эти функции определены так:
C++
1
2
void *operator new(std::size_t size) throw(std::bad_alloc);
void *operator new[](std::size_t size) throw(std::bad_alloc);
Отметим, что при невозможности выделить память конструктор не вызывается. Более того, пункт стандарта 5.3.4/17 гласит, что в случае возникновения исключения во время инициализации объекта сначала выполняется возврат выделенной памяти, а затем начинается обработка исключения. Таким образом, механизм new/delete еще и значительно более надежен и безопасен по сравнению с механизмом malloc()/free().

Уничтожение динамического объекта тоже выполняется в два шага: сначала вызывается деструктор, а затем функция возврата памяти. Время жизни динамического объекта заканчивается, когда начинается выполнение кода деструктора. Функции возврата памяти определены в стандарте там же, где и функции выделения памяти, и имеют следующие прототипы:
C++
1
2
void operator delete (void *) throw();
void operator delete [](void *) throw();
Как и показанное выше создание динамических POD-объектов, динамический объект произвольного класса можно создать без инициализации.
C++
1
2
Type *p1 = new Type;                
Type *p2 = new Type();
При наличии в классе определенного конструктора без аргументов в данном случае после выделения памяти вызывается именно он. Кроме того, мы можем инициализировать динамические объекты (аналогично объектам встроенных типов), если в классе определен конструктор инициализации.

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

Создание динамических объектов-констант ничем не отличается от создания динамических констант встроенных типов. Конечно, даже динамически создаваемую константу требуется инициализировать (для этого в классе должен быть определен конструктор инициализации), однако и Visual C++.NET 2003, и C++ Builder 6 «пропускают» отсутствие инициализации. Например, без всяких сообщений транслируется такое объявление
C++
1
const Type *p1 = new const Type;
Естественно, в этом случае во время выполнения вызывается конструктор без аргументов.

Операция delete осуществляет уничтожение динамических объектов: сначала вызывается деструктор, а затем возвращается память. Возврат памяти выполняется функцией operator delete() для одиночного объекта и для массива — функцией operator delete[](). Как мы уже знаем, эти функции не генерируют исключений. Это гарантирует, что операция уничтожения объекта не преподносит никаких сюрпризов — ведь деструктор тоже не должен генерировать исключений. При уничтожении массива деструктор вызывается для каждого элемента удаляемого массива.

Добавлено через 2 минуты
Цитата Сообщение от OstapBender Посмотреть сообщение
хехехе) ну так ваш ob создается и существует только в блоке try...
Вот тебе и с динамическим:
C++
1
2
3
4
5
6
7
8
9
10
11
int main()
{   a *pa;
    try {
          a ob(5);
          pa = new a(-5);
        } catch(int) {
                std::cout << "Bad alloc\n";
        }
        system("pause");
                return 0;
}
4
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru