Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
0 / 0 / 0
Регистрация: 05.11.2015
Сообщений: 33

Использование __try __finaly для освобождения памяти

15.01.2017, 03:03. Показов 2518. Ответов 35
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте.
Подскажите, как возможно использовать конструкцию __try, __finaly для освобождения ресурсов в одном месте.
Пример:

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
27
28
29
30
int err;
int *a = (int *)malloc(4);
if (err = my_function() == 0)
{
    free(a);
    return 1;
}
int *b = (int *)malloc(4);
if (err = my_function() == 0)
{
    free(a);
    free(b);
    return 1;
}
...
int *z = (int *)malloc(4);
if (err = my_function() == 0)
{
    free(a);
    free(b);
    ...
    free(z);
    return 1;
}
...    // полезный код, что-то выводим
free(a);
free(b);
...
free(z);
return 0;
Как можно использовать освобождение памяти в одном месте с помощью конструкции _try...__finaly? Код, конечно, искусственный, но часто приходится сделить за всеми освобождениями по мере возникновения ситуаций исключения.
Тут речь не о контроле ошибок, а о том, чтобы не следить каждый раз за тем, какие именно free() надо писать в каждом случае, а вместо этого запихнуть их все в финальный блок __finaly.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
15.01.2017, 03:03
Ответы с готовыми решениями:

Распределение памяти для выделения и освобождения блоков памяти внутри запрошенного пула
В программе малые"дыры" избегают,что нужно сделать что бы малые "дыры" не избегались.... # include <stdio.h> # include...

Пауза в цикле, для освобождения памяти
Еще один вопрос. В цикле через 3 секунды надо проверять наличие файла и если он появится, то рaспечатывать. Как в этом цикле сделать паузу...

Программа для освобождения оперативной памяти
Подскажите пожалуста программу, которая создана для ram, чтобы удаляла сама ненужные процессы. оперативы 2 гб, не хватает. спасибо

35
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
15.01.2017, 20:42
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
это может выглядеть так только если
А что, оно не так? "In all cases, if ptr is a null pointer, the standard library deallocation functions do nothing."
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
15.01.2017, 21:01
Цитата Сообщение от Убежденный Посмотреть сообщение
То есть, понятие безопасности кода мы вообще не рассматриваем, только "красоту"?
А при чём тут безопасность?

Если она и при чём, то любая ошибка, в том числе и ошибка безопасности, увеличивает шанс родиться в том числе и в случае нечитаемого кода

Цитата Сообщение от Croessmah Посмотреть сообщение
т.е. Ваш вариант с кучей if'ов и goto более читаемый?
Да. Потому что ты смотришь на код, и видишь, что он делает, а не скачешь по классам в попытках установить общую картину

Цитата Сообщение от Croessmah Посмотреть сообщение
Так может тогда сразу стоило взять C?
WinApi написан на Си, и никуда ты от этого не денешься
0
 Аватар для Fulcrum_013
2083 / 1575 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
15.01.2017, 21:05
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
27
28
29
30
template <class ContainedType>
class TOweList:private TPtrList<ContainedType>{ //TPtrList - динамический массив сырых указателей;
       friend class ContainedType;
public:
       ~TOweList(){ for(int i=0;i<Count;i++) delete Items[i];
}
class TResource{
private:
       friend class TOweList<TResource>;
        ~virtual TResource(){};
public:
        TResource(TOweList<TResource>* OweList):{OweList->Add(this)};
}
использование для приведенного топик стартером примера:
class TInt4Resorce:public TResource{
public:
       int Data[4];
       //ну и дальше что там с ними делать надо       
}
void Foo(){
int err;
TOweList<TResource> Resources;
TInt4Resource *a = new TInt4Resource(&Resources);
if (!my_function())  return 1;
TInt4Resource *b = new TInt4Resource(&Resources);
if (my_function()) return 2;
...
TInt4Resource *z= new TInt4Resource(&Resources);
if (my_function()) return 28;
}
Это пример сильно владеющего контейнер где удалить ресурсы может только контейнер. Довольно просто, добавлением оповещения списка из паблик деструктора ресурса можно сделать слабо владеющий контейнер - т.е. допускающий внешнее удаление ресурсов и убирающих из себя ссылку на удаленный ресурс.
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
15.01.2017, 21:10
Цитата Сообщение от Evg Посмотреть сообщение
А при чём тут безопасность?
Как ты с goto обеспечишь строгие гарантии безопасности исключений?

Вот у нас есть функция:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void SomeFunc()
{
    resource res1 = acquireResource();
    if (!res1) {
        log("acquireResource (#1) failed.");
        goto cleanup;
    }
 
    resource res2 = acquireResource();
    if (!res2) {
        log("acquireResource (#2) failed.");
        goto cleanup;
    }
 
    AnotherFunc(res1, res2);
 
cleanup:
 
    if (res2) releaseResource(res2);
    if (res1) releaseResource(res1);
}
Допустим, AnotherFunc выбрасывает C++ исключение. Получаем утечку.
Как предлагается разруливать? Отказываться полностью от исключений?
0
 Аватар для Fulcrum_013
2083 / 1575 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
15.01.2017, 21:15
Цитата Сообщение от Убежденный Посмотреть сообщение
Как ты с goto обеспечишь строгие гарантии безопасности исключений?
А с goto этого не сделать. поэтому (хотя и не только поэтому) и нужны владеющие контейнеры.

Добавлено через 2 минуты
Цитата Сообщение от Evg Посмотреть сообщение
WinApi написан на Си, и никуда ты от этого не денешься
Ну скажем так - винапи это легаси помойка которую давно пора переделать на СOM. Но даже если что то и получает COM интерфейс все равно приходится для обратной совместимости параллельно тащить сишный гадюшник.
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
15.01.2017, 21:26
Цитата Сообщение от Evg Посмотреть сообщение
Потому что ты смотришь на код, и видишь, что он делает
Смотришь на код и видишь, что там лапша,
в которой еще нужно понять,
где алгоритм работы,
а где обработка ошибок.
А если там еще какой-нибудь Doxygen...
вообще код не найдешь.
Цитата Сообщение от Evg Посмотреть сообщение
WinApi написан на Си, и никуда ты от этого не денешься
Ы-ы-ы, я под Linux'ом, у меня нет WinAPI.
Чуть ниже вообще машинные коды.
Часто пишешь в машинных кодах?
От них же никуда не деться.
Это я к тому, что раз мы в C++,
то, наверное, стоит говорить о C++.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
15.01.2017, 22:13
Цитата Сообщение от Убежденный Посмотреть сообщение
Как ты с goto обеспечишь строгие гарантии безопасности исключений?
Цитата Сообщение от Убежденный Посмотреть сообщение
Допустим, AnotherFunc выбрасывает C++ исключение. Получаем утечку.
Как предлагается разруливать? Отказываться полностью от исключений?
Понял вопрос. Я говорил о конкретно данном случае, когда мы работаем с интерфейсами, изначально написанными на Си

Цитата Сообщение от Croessmah Посмотреть сообщение
Смотришь на код и видишь, что там лапша,
в которой еще нужно понять,
где алгоритм работы,
а где обработка ошибок.
Конкретно в данном случае лапша более читаемая, чем искусственно созданные классы. Естественно, это мой мнение, я его никому не навязываю. Просто делюсь своим опытом, ибо досточно пришлось ковыряться в чужих кодах, так же как достаточно видел подобных искусственно созданных геморроев на ровном месте

Цитата Сообщение от Croessmah Посмотреть сообщение
Ы-ы-ы, я под Linux'ом, у меня нет WinAPI
А какая разница? Линуксовый API точно так же написан на Си

Цитата Сообщение от Croessmah Посмотреть сообщение
мы в C++
Ты вроде бы не первый день на форуме, чтобы понимать, что тема созданная в разделе Си++ не обязательно по существу к Си++ относится. Тем более, что оба примера от ТС были написаны на Си
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
16.01.2017, 12:20
Цитата Сообщение от Evg Посмотреть сообщение
Конкретно в данном случае лапша более читаемая, чем искусственно созданные классы.
лапша всегда менее читабельна.

любопытно другое:
а что, бывают не "искусственно созданные классы" ?

и когда же использование классов реально оправданно,
по мнению заядлого сишника?
1
 Аватар для HighPredator
6045 / 2160 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
16.01.2017, 12:40
Цитата Сообщение от hoggy Посмотреть сообщение
и когда же использование классов реально оправданно,
по мнению заядлого сишника?
В тот момент, когда возникла реальная, а не искусственная необходимость. TDD, принципы YAGNI+KISS. Если проще и понятнее в сишном стиле, то классы не нужны. Не джава ж.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
16.01.2017, 13:05
Цитата Сообщение от HighPredator Посмотреть сообщение
TDD
как бе ортогонально классам.

Цитата Сообщение от HighPredator Посмотреть сообщение
Если проще и понятнее в сишном стиле, то классы не нужны.
проще для кого?
вон, сишнику проще читать лапшу из многочисленных ифоф,
и в ручную дергать фряхи.

а приплюснутому проще, быстрее, удобнее,
надежнее и читабельней будет поюзать RAII.

кода меньше. код проще.
1
 Аватар для HighPredator
6045 / 2160 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
16.01.2017, 13:59
Цитата Сообщение от hoggy Посмотреть сообщение
TDD как бе ортогонально классам
С чего это вдруг? ООП как и ФП оперирует функциями/функциональностями, оперирующими над данными. Следуя вашему тезису, то тдд ортогонально вообще всему что есть. Что собственно не так.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
16.01.2017, 14:09
Цитата Сообщение от HighPredator Посмотреть сообщение
С чего это вдруг?
вопрос был: когда оправданно использовать классы?
и при чем здесь TDD?
0
 Аватар для HighPredator
6045 / 2160 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
16.01.2017, 14:13
Цитата Сообщение от hoggy Посмотреть сообщение
когда оправданно использовать классы?
Я привел кейс. С указанием принципов откуда вытекает.
Цитата Сообщение от hoggy Посмотреть сообщение
и при чем здесь TDD?
При том, что это признанная и распространенная методология разработки софта. И команды, которые работают по agile-у например, часто пишут по тдд. Вот при этом.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
16.01.2017, 14:20
Цитата Сообщение от HighPredator Посмотреть сообщение
Я привел кейс. С указанием принципов откуда вытекает.
вы не привели ни одного кейса и никаких принципов.
а весь ваш тезис звучит:
"классы нужно использовать тогда, когда нужно".

афигительное объяснение!

Цитата Сообщение от HighPredator Посмотреть сообщение
При том, что это признанная и распространенная методология разработки софта
какое это имеет отношение к моему вопросу?
какое это вообще имеет отношение к теме классов?
что за бред вы сейчас несете?

- когда оправданно использовать классы?
- TDD - это признанная и распространенная методология разработки софта.

занавес...
1
 Аватар для HighPredator
6045 / 2160 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
16.01.2017, 14:34
Цитата Сообщение от hoggy Посмотреть сообщение
вы не привели никаких принципов
Лгать нехорошо.
Цитата Сообщение от HighPredator Посмотреть сообщение
TDD, принципы YAGNI+KISS
Раз вы вместо того, чтобы как нормальный взрослый человек честно сказать, мол, я не знаю что это такое все, переводите разговор в плоскость "ничего не вижу, не слышу и не читаю", то диалога у нас с вами не будет. Оставляю это вам на самостоятельное изучение.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
16.01.2017, 15:00
Цитата Сообщение от HighPredator Посмотреть сообщение
Лгать нехорошо.
вот поэтому и не лгите.
потому что вы не ответили на вопрос.

вот это:
Цитата Сообщение от HighPredator Посмотреть сообщение
YAGNI+KISS
ничерта не объясняет.

это тоже самое что и:
Цитата Сообщение от hoggy Посмотреть сообщение
"классы нужно использовать тогда, когда нужно".
вы вообще никак не раскрыли тему.

Цитата Сообщение от HighPredator Посмотреть сообщение
мол, я не знаю что это такое все
я прекрасно знаю что такое TDD,
которое вообще не имеет отношение к обсуждаемой теме.

знаю что такое "принцип отказа от избыточной функциональности".
и что такое "принцип: делай как проще".

вы же ссылаетесь на "умные" аббревиатуры,
но как то не в состоянии объяснить:
а как же ими пользоваться?

есть вполне определенный вопрос:
- когда оправданно использовать классы?

вот и распишите на конкретных примерах.
когда оправданно,
а когда нет.

Цитата Сообщение от HighPredator Посмотреть сообщение
Оставляю это вам на самостоятельное изучение.
ну ну.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.01.2017, 15:00

Написать функции для работы с массивом - выделения/освобождения памяти, консольного ввода/вывода
Напишите функции: 1) выделяющую память для массива данных типа float, 2) заполняющую ячейки данными с клавиатуры, 3) выводящую...

Изучение динамических структур данных на примере односвязных списков, процедур для выделения и освобождения памяти
помогите пожалуйста вот задание Сформировать односвязный список из 5 записей, удалить записи, удовлетворяющие некоторому...

С++ Проверка освобождения памяти
Добрый день. На начальном курсе С++ получил такую задачу: Написать функцию, которая получает массив строк и его размер, и...

Ошибка освобождения памяти
Пытаюсь прочитать из файла и вывести на консоль. Файл текстовый, слова написанные в столбик. Вот код: #include &lt;malloc.h&gt; ...

Указатель после освобождения памяти
Стивен Прата, глава 4, раздел &quot;Освобождение памяти с помощью операции delete&quot; Я пытаюсь понять. Написал: #include...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
36
Ответ Создать тему
Новые блоги и статьи
сукцессия 30. Фосфорный и азотный замки по "честному" закону лимитирования Либиха
anaschu 16.07.2026
Основные достижения за последние дни 1. Механизм отложенного высвобождения фосфора Добавлен специальный пул для медленного разложения меланизированных гиф ЕСМ Реализована разная скорость. . .
Запрет пометки на удаление и отмены проведения
Maks 16.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "ПутевойЛист" разработанного в КА2. Задача: запретить помечать на удаление и отменять проведения путевого листа при условии, если он сдан. . .
Как надо было делать правильно - вообще не слушать ИИ, его дело - текст.
Hrethgir 15.07.2026
А вообще надо было делать не так, чтобы не исправлять ошибку https:/ / www. cyberforum. ru/ blogs/ 223907/ 10996. html , правильно было : удалил кнопку, а потом добавил её. Всё это стресс конечно. Почему?. . .
Знаете, от чего появляется стресс?
kumehtar 15.07.2026
Стресс появляется оттого, что вы, зная как поступить правильно, делаете наоборот. Ларри Уингет
Нас бьют, а мы крепчаем? Какая чушь!
kumehtar 15.07.2026
Вот это вот бытующее мнение, что человек меняется только под действием проблем, всегда считал вредоносным. Поверь, от проблем у людей появляются не изменения, а нервное расстройство и ПТСР. А. . .
сукцессия 29. Переход от одних деревьев на другие делать более или менее вероятностным?
anaschu 12.07.2026
Насколько смена типов микоризы — исключительное событие в двухвековой сукцессии? Оценка вероятности в пространстве параметров В текущей версии модели успешно реализован ключевой механизм. . .
сукцессия 27. Думаю, как переделывать уже написанную статью с планами на сукцессию.
anaschu 12.07.2026
Анализ соответствия модели требованиям Реализованные компоненты: Механизм закисления почвы через протонную помпу Конкуренция между типами микориз pH как триггер сукцессии C/ P соотношение. . .
Сукцессия 26. Мат модель создана.
anaschu 12.07.2026
Модель смены растительных сукцессий посредством управления грибами работает внутри небольшой ячейки почвы, восстанавливающейся после пожара, где ненадолго бывшее царство хвойных снова захватили. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru