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

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

15.01.2017, 03:03. Показов 2644. Ответов 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
21286 / 8311 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 30
15.01.2017, 21:01
Цитата Сообщение от Убежденный Посмотреть сообщение
То есть, понятие безопасности кода мы вообще не рассматриваем, только "красоту"?
А при чём тут безопасность?

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

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

Цитата Сообщение от Croessmah Посмотреть сообщение
Так может тогда сразу стоило взять C?
WinApi написан на Си, и никуда ты от этого не денешься
0
 Аватар для Fulcrum_013
2083 / 1576 / 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 / 1576 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
15.01.2017, 21:15
Цитата Сообщение от Убежденный Посмотреть сообщение
Как ты с goto обеспечишь строгие гарантии безопасности исключений?
А с goto этого не сделать. поэтому (хотя и не только поэтому) и нужны владеющие контейнеры.

Добавлено через 2 минуты
Цитата Сообщение от Evg Посмотреть сообщение
WinApi написан на Си, и никуда ты от этого не денешься
Ну скажем так - винапи это легаси помойка которую давно пора переделать на СOM. Но даже если что то и получает COM интерфейс все равно приходится для обратной совместимости параллельно тащить сишный гадюшник.
0
Неэпический
 Аватар для Croessmah
18150 / 10732 / 2067
Регистрация: 27.09.2012
Сообщений: 27,047
Записей в блоге: 1
15.01.2017, 21:26
Цитата Сообщение от Evg Посмотреть сообщение
Потому что ты смотришь на код, и видишь, что он делает
Смотришь на код и видишь, что там лапша,
в которой еще нужно понять,
где алгоритм работы,
а где обработка ошибок.
А если там еще какой-нибудь Doxygen...
вообще код не найдешь.
Цитата Сообщение от Evg Посмотреть сообщение
WinApi написан на Си, и никуда ты от этого не денешься
Ы-ы-ы, я под Linux'ом, у меня нет WinAPI.
Чуть ниже вообще машинные коды.
Часто пишешь в машинных кодах?
От них же никуда не деться.
Это я к тому, что раз мы в C++,
то, наверное, стоит говорить о C++.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21286 / 8311 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
FPS контроллер с анимированными Y-Bot и 3D-звуком miniaudio (Box3D, Recast, BehaviorTree.CPP, ozz-animation, ImGui, OpenGL и SDL3)
8Observer8 18.10.2026
Содержание блога | English Version Полное мультиплатформенное руководство по стартовому проекту с FPS-контроллером игрока, анимированными роботами Y-Bot с 4-слойным блендингом, 3D-физикой Box3D,. . .
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/ TL DR Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru