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

uninitialized_fill() - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Проверить, является ли введенное число палиндромом http://www.cyberforum.ru/cpp-beginners/thread962676.html
Проверьте, является ли введенное число палиндромом. Например, 12321, 2442 - палиндромы. В С++.
C++ safe_insert() для map Привет!!! Есть задачка: "Напишите усовершенствованный вариант safe_insert() исключительно для ассоциативных контейнеров. Используйте traits для написания safe_insert(), который автоматически... http://www.cyberforum.ru/cpp-beginners/thread962672.html
C++ Вычислить сумму первых n целых положительных чисел. В С++
Вычислить сумму первых n целых положительных чисел. В С++
Запишите функцию для вычисления произведения целых чисел из диапазона от а до в. найдите произведение чисел, диапазон ввести с клавиатуры. В С++ C++
Запишите функцию для вычисления произведения целых чисел из диапазона от а до в. найдите произведение чисел, диапазон ввести с клавиатуры. В С++
C++ вычисления факториала http://www.cyberforum.ru/cpp-beginners/thread962657.html
Составить программу для вычисления факториала числа. Найдите факториалы 4, 7, 10. В С++
C++ Матрица в C++ Задана матрица А(5,5). Если в строке есть хотя бы один нуль, то заменить эту строку единицами. подробнее

Показать сообщение отдельно
ninja2
231 / 187 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
26.09.2013, 12:38  [ТС]
castaway, Ладно трудно это пока еще понять. Буду как синтаксис неосмысленный использовать.
А от смотри если у нас есть функция uninitialized_fill:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
template<class For, class T>
void uninitialized_fill(For beg, For end,  T& x)
{
    For p;
    try
    {
        for(p=beg;p!=end;++p)
            new (static_cast<void*>(&*p))T(x);//создаем копию х в *p (параграф 10.4.11)
        //&*p мы получаем адресс разыменованого элемента с целью получения указателя.
    }
    catch(...)
    {
        for(For q=beg;q!=p;++q)
        {
            (&*q)->~T();//вызываем деструктор
        }
        throw;
    }
}
Тут поддерживается базовая гарантия, та даже она не поддерживается потому что если в деструкторе будет сгернерировано исключение у нас произойдет утечка памяти, память просто высвободится в блоке и try и при исключении в catch будет удаляться с помощью деструктора, но когда деструктор вызовет какое нить исключение память не вся удалиться.

Я от придумал простое решение заключить снова в try блок и ловить исключения которые будут в деструкторе, так просто у нас получиться минимизировать утечку памяти, но полностью устранить на 100 % утечку не получить, потому что сам деструктор может сгенерировать исключение раньше чем он освободит память для объекта, мы тут сильную гарантию дать не можем, да какую сильную вообще базовую гарантию дать не можем????

Базовая гарантия это когда нет утечек ресурса и объект находится в состоянии нормальной инициализации, в коком нить состоянии, но может быть отличном от того до которого он был до выполнения операции.
Сильная гарантия это как базовая, только операция при неудаче не изменяет объект, он как и был остается в прежнем состоянии до выполнении операции
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
template<class For, class T>
void uninitialized_fill(For beg, For end,  T& x)
{
    For p;
    try
    {
        for(p=beg;p!=end;++p)
            new (static_cast<void*>(&*p))T(x);//создаем копию х в *p (параграф 10.4.11)
        //&*p мы получаем адрес разыменованого элемента с целью получения указателя.
    }
    catch(...)
    {
        for(For q=beg;q!=p;++q)
        {
            try
            {
                (&*q)->~T();//вызываем деструктор
            }
            catch(...)
            {
 
            }
        }
        throw;
    }
}
Добавлено через 6 минут
Ну допустим эту задачку я правильно сделал, просто методов вроде как других нету кроме как использовать try блок и при исключении возвращать объект в прежнее состояние, либо освобождать ресурсы. Но есть еще одна задачка которая более запутанная "Попробуйте переписать uninitialized_fill() (параграф 19.4.4, Е.3.1) так, что бы он справлялся с итераторами, которые генерируют исключения в операциях -- и ++. Возможно ли это? Если да, то какова стоимость такого решения? Если нет, то почему? " мне вообще не ясно где тут генерируется исключение что бы можно как небуть его переписать?

От код программки которую нужно переписать:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
template<class For, class T>
void uninitialized_fill(For beg, For end,  T& x)
{
    For p;
    try
    {
        for(p=beg;p!=end;++p)
            new (static_cast<void*>(&*p))T(x);//создаем копию х в *p (параграф 10.4.11)
        //&*p мы получаем адресс разыменованого элемента с целью получения указателя.
    }
    catch(...)
    {
        for(For q=beg;q!=p;++q)
        {
            (&*q)->~T();//вызываем деструктор
        }
        throw;
    }
}
Добавлено через 6 минут
здесь похоже имеется введу что итератор сгенерирует исключение в этом блоке:
C++
1
2
3
4
5
6
7
8
catch(...)
    {
        for(For q=beg;q!=p;++q)
        {
            (&*q)->~T();//вызываем деструктор
        }
        throw;
    }
То такая запись даже не спасет:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
catch(...)
    {
        for(For q=beg;q!=p;++q)
        {
            try
            {
                (&*q)->~T();//вызываем деструктор
            }
            catch(...)
            {
 
            }
        }
        throw;
    }
Уже смысла нету оно будет просто зацикливание - крах программы. Значит получается тут уже нельзя ничего сделать. Получается для деструктора еще что то можно сделать, а от для операций итераторных ++ -- ничего не сделает, там 100% потеря ресурсов, но краха можно избежать.
0
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru