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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.79
GibbonCho
0 / 0 / 0
Регистрация: 18.11.2013
Сообщений: 16
#1

Блок try catch жрет память - C++

18.11.2013, 12:45. Просмотров 1839. Ответов 48
Метки нет (Все метки)

Доброго времени суток! Проблема случилась там, где ее никак не ожидал, ответа ни в поисковиках, ни на форумах не нашел. Вся надежда на вас!

в общем есть блок
C++
1
2
3
4
5
try{
  //код, соединения с сервером или отправки сообщения серверу
} catch(Exception *e){
  //обработка ошибки подключения или отправки
}
Так вот при каждом исключении увеличивается память (в диспетчере задач).
Среда : C++ Builder 6

Без блока try catch память не растет, но приложение при ошибке перестает работать, естественно.
Читал о том, что в c++ у блока catch отсутствует деструктор. Еще читал про то, что если поставить ключ компиляции /EHa, то catch не будет кушать память..
Помогите, пожалуйста, весь интернет перерыл, не могу найти ответ.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.11.2013, 12:45
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Блок try catch жрет память (C++):

Программа с opencv жрет память - C++
Вообщем есть программа, после каждой итерации очищаю память, но все-равно почему то буквально за 2-3 цикла по j, программа падает из-за...

Блок try-catch - C++
В некоторых программах он хорошо работает и в блоке catch выводит то что написал, а в некоторых среда VS говорит "Необработанное исключение...

Работает ли указатель на базовый класс исключения, когда попадает в блок catch - C++
Работает ли указатель на базовый класс исключения, когда попадает в блок catch так же как обычно? То есть, если есть переопределенные...

Как передать управление в блок catch после системного исключения (компилятор g++)? - C++
Вот пример: не удаётся это сделать #include <windows.h> #include <stdio.h> //Эта функция- НОВЫЙ обработчик...

Один блок catch для двух типов исключений порожденных от одного класса - C++
Товагищи!! Имеется задача с книги С. Прата с++11. Не могу реализовать следующее : Вот к чему пришел #include <iostream> #include...

Как записать блок данных в память ? - C++
Есть ли какая нибудь функция типа fwrite(), которая может писать блоки данных разной длины, но из памяти в память ? Например есть...

48
Dreablin
5 / 5 / 1
Регистрация: 05.02.2010
Сообщений: 124
20.03.2015, 17:06 #31
Цитата Сообщение от Tulosba Посмотреть сообщение
Т.е. за 5 суток ~60 метров набегало в плюс?
Около того.
Цитата Сообщение от Tulosba Посмотреть сообщение
Лучше посчитать именно на кол-во итераций цикла, секунды ничего не говорят, если не знаешь сколько раз действие было выполнено на это время.
400 кб за 12700 попыток Get
0
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
20.03.2015, 17:47 #32
Dreablin, я думаю надо копаться в Indy. Но тут я вряд ли смогу помочь. Кстати, если ещё не видел эту тему, обрати внимание:
http://stackoverflow.com/questions/5...ed-for-indy-10
0
-=ЮрА=-
Заблокирован
Автор FAQ
20.03.2015, 22:07 #33
Цитата Сообщение от Dreablin Посмотреть сообщение
К сожалению, ты ответил на тему 3х летней давности. Я написал в ней же, у меня схожая проблема, но никого new в try нет. Никакой динамики в икле нет, а память уходит... Мой код на пару сообщений выше
- почему к сожалению?По поводу памяти
Цитата Сообщение от Dreablin Посмотреть сообщение
try {
* * * * * * * * tmp_data_str = IdHTTP1->Get(tmp_request_str);
* * * * * * }
- в try{}catch() повешен метод Get, как я понимаю речь идёт об HTTP протоколе, для начала хотелось бы увидеть начинку метода. Если же метод в статической либе то почти 100% в методе идёт нечто аля
C++
1
2
char * buffer = new char[1 + bufSize];
recv(socket, buffer);// вот навернулся recv - улетела память
Добавлено через 2 минуты
Касательно исключений - для начала делаем
C++
1
2
3
4
5
6
7
try{
    //наша лапша из кода
}
catch(CException *e){
    e->ReportError();//узнаём что случилось
    e->Delete();//пробуем кроме сброса флага пофиксить испорченный thread context
}
Более детально могу разрулить лишь когда увижу полный сегмент кода с утечкой

Добавлено через 1 минуту
Вот пример использования API для работы с Win - эксепшинами https://msdn.microsoft.com/en-us/library/97z4sxfb.aspx

Добавлено через 1 минуту

Не по теме:

Dreablin, короче давай в студию начинку

Цитата Сообщение от Dreablin Посмотреть сообщение
tmp_data_str = IdHTTP1->Get("http://192.168.1.149/dvmh.cgi HTTP/1.1");



Добавлено через 2 минуты
Цитата Сообщение от ForEveR Посмотреть сообщение
Что? Освобождение ресурсов осуществляет конкретный класс эксепшна? Только если ресурсов выделенных внутри данного класса исключения...
Не по теме:
Сообщение от -=ЮрА=-
так что у меня свои методы восстановления справедливости.
Справедливость должна быть восстановлена! (c) Утер Светоносный
- ну тогда тебе тоже сюда https://msdn.microsoft.com/en-us/lib...(v=vs.60).aspx почитай немного литературки о том как происходит обработка исключений в Win а то как то неканает твоё удивление. конкретный CXtypeException вызывает конкретную обработку исключительной ситуации и конкретный класс CXtypeException сбрасывает флаг ошибки + производит на сколько это возможно возвращение стека.

Добавлено через 1 минуту

Не по теме:

Да ForEveR добавлю что CEception является базовым классом для обработки исключений(способен вызвать необходимый обработчик), хотя лан чё мне тебя учить ты ж вроди как тут "светило", думаю msdn открыть сможешь. Короче жду тебя)

0
castaway
Эксперт С++
4884 / 3019 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
20.03.2015, 22:26 #34
-=ЮрА=-, речь о обычных исключениях языка C++.
С чего ты вообще взял что речь идёт именно о ОС Windows?
Какого хрена ты приплетаешь сюда какие-то CXtypeException и CEception? В языке нет таких терминов.
Почитай хоть раз нормальную книгу по C++ вместе со наброском стандарта. Ты слишком сильно застопорился со своим древним как говно мамонта MFC.
3
-=ЮрА=-
Заблокирован
Автор FAQ
20.03.2015, 22:35 #35
-=ЮрА=-, речь о обычных исключениях языка C++.
С чего ты вообще взял что речь идёт именно о ОС Windows?
- с чего взял, да вот с вот этого
C++
1
2
3
4
5
6
[quote="GibbonCho;5350935"]1
try{
* //код, соединения с сервером или отправки сообщения серверу
} catch(Exception *e){
* //обработка ошибки подключения или отправки
}[/quote]
- мне это похоже на обычное ВИН CException
Да ForEveR, это для тебя
Цитата Сообщение от ForEveR Посмотреть сообщение
Что? Освобождение ресурсов осуществляет конкретный класс эксепшна?
- смотри сам
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
#include <afx.h>
#include <iostream>
using namespace std;
 
int main(){
    char * str;
    system("pause");
    //Вот пример утечки в 10 Мб
    for( size_t i = 0; i < 10; i++ ){
        try
        {
            str = new char[1024*1024];
            THROW(new CMemoryException());
            
        }
        catch( CMemoryException * e)
        {
            e->ReportError(MB_OK, 0);
            e->Delete();
            cerr<<"exception #"<<i + 1<<endl;
        }
    }
    system("pause");
    return 0;
}
будь добр сравни показания диспетчера для поста 14 с этими скриншотами(хотя нет ты у себя слинкуй да погляди). Заметил рестор памяти от итерации к итерации начиная со 2-й?В первой итерации произошли изменения в тредконтексте потому немного памяти съелось, после всё оставалось на уровне.
1
Миниатюры
Блок try catch жрет память   Блок try catch жрет память  
Voivoid
675 / 278 / 12
Регистрация: 31.03.2013
Сообщений: 1,339
20.03.2015, 23:38 #36
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
мне это похоже на обычное ВИН CException
Ох, лол, точно. Даже не обратил внимание ( и похоже не я один ), что там указатель. Кроме как в MFC такой дичью вроде никто больше не пользуется, так что похоже действительно оно ( ну или топикстартер просто опечатался ). Приношу извинения за, как оказалось, неуместное троллирование.
0
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
21.03.2015, 07:38 #37
Voivoid, топикстартеров тут два: один 2013 года с указателем - GibbonCho, другой 2015 со ссылками (см. например код в сообщении #24) - Dreablin. Проблемы первого уже никто в здравом уме тут не обсуждает.
0
ForEveR
В астрале
Эксперт С++
7978 / 4737 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
21.03.2015, 09:49 #38
-=ЮрА=-, Соглашусь, мое сообщение было не совсем уместно. MFC я абсолютно не знаю. Спасибо за объяснение.
0
-=ЮрА=-
Заблокирован
Автор FAQ
21.03.2015, 09:50 #39
GibbonCho, Dreablin, по прежнему жду полный листинг метода Get на котором улетала память, увижу код скажу конкретно где как и что текло.
0
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
21.03.2015, 10:31 #40
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
жду полный листинг метода Get на котором улетала память
Если ты ещё не понял, оба ТС используют библиотеку Indy. Get - метод класса этой библиотеки. Хочешь полного кода - качай исходники Indy. Только учти что она писана на Delphi.
Зачем ты сюда приплел MFC и начал баламутить тему подходами от MS я могу только догадываться. ТСы пользуются C++ Builder'ом (RAD Studio), никакой связи с MFC тут и в помине нет.
0
-=ЮрА=-
Заблокирован
Автор FAQ
21.03.2015, 11:00 #41
Если ты ещё не понял, оба ТС используют библиотеку Indy. Get - метод класса этой библиотеки. Хочешь полного кода - качай исходники Indy. Только учти что она писана на Delphi.
- я не использую сторонних библиотек в разработках(политика фирмы), если что то надо пишу сам, с нуля(абсолютно всё и проприетарные вещи тоже). На вопрос - зачем тратить время на разработку аналогов уже готовых либ отвечу - вот как раз по тем причинам, что "течёт невесть откуда" не используем сторонний софт и либы в своих разработках.
Зачем ты сюда приплел MFC и начал баламутить тему подходами от MS я могу только догадываться. ТСы пользуются C++ Builder'ом (RAD Studio), никакой связи с MFC тут и в помине нет.
- билдер содержит windows.h да и вообще VCL и MFC имеют общие корни.
Если ты вдруг не знал этого то процитирую ВиКи
C++Builder первоначально создавалась только для платформы Microsoft Windows.
У топикстартера в коде явное вин исключение поэтому я подожду его.
0
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
21.03.2015, 16:41 #42
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
я не использую сторонних библиотек
Рад за тебя. Но ТС использует, и ответ ему нужен по совершенно конкретной проблеме, которая, судя по всему, связана с совершенно конкретной библиотекой. Ты о ней не знаешь, я о ней тоже не особо в курсе. Однако твой подход таков, что если у тебя в руке молоток (MFC) - всё можно считать гвоздями (исключения передаются по указателю). Но не надо навязывать молоток людям, которые пилят дрова. Потому что дрова - это не гвозди.
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
билдер содержит windows.h
Любой компилятор под винду будет содержать подобный файл. Но из этого вовсе не следует, что исключения будут использоваться в MFC-манере с передачей по указателю.
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
У топикстартера в коде явное вин исключение поэтому я подожду его.
Это с высокой долей вероятности не соответствует действительности. Объясняю почему:

1. GibbonCho (первый ТС) написал перехват по указателю (ты как раз за этот момент зацепился, и приплел сюда MFC), но это ещё не значит, что ТС вообще понимал что пишет.
2. Почему-то ты не учел, что класс называется не CException как принято в MFC, а Exception (базовый класс исключений в VCL).
3. ТС явно указал какую среду он использует
Цитата Сообщение от GibbonCho Посмотреть сообщение
Среда : C++ Builder 6
Заметь, это не Visual Studio.
4. ТС даже начал сомневаться в исходной постановке задачи:
Цитата Сообщение от GibbonCho Посмотреть сообщение
и не смотря на то, что исключения он ловил, память не росла. Каюсь, неправильно поставил диагноз..
5. У второго "ТС" (Dreablin) никаких указателей нет и в помине (см. код в сообщении #24). Явная передача по ссылке.

После этого ты всё ещё будешь утверждать:
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
в коде явное вин исключение
?
Или любое исключение, которое возникает в программе под виндой ты называешь "вин исключением"?

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
поэтому я подожду его.
Удачи.
Последняя активность: 12.03.2014 14:28
5
-=ЮрА=-
Заблокирован
Автор FAQ
21.03.2015, 17:27 #43
Ещё раз для особо непонятливых речь тут идёт о Билдере
Цитата Сообщение от GibbonCho Посмотреть сообщение
Среда : C++ Builder 6
который содержит windows.h, код в посте 1 указывает на механизм эксепшинов WIN(которых ты не знаешь) код Dreablin не соджержит класса эксепшна потому как по всей видимости человек наивно предполагал что catch(...) излечит от всего.

Касательно проблемы - достаточно сделать вот это
C++
1
2
3
4
5
6
try{
   Get()
}
catch(CMemoryException * e){
   e->Delete();
}
и с вероятностью 99,9 % утечка уйдёт. Так до тебя дошло?
Касательно MFC, с ним написана добрая часть ОС окна, что тебе не нравится?Да я определённое время создавал GUI на нём и знаю MFC довольно неплохо и что из этого?
0
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
21.03.2015, 18:01 #44
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
который содержит windows.h
Я уже объяснил выше, что это ничего не значит с точки зрения подхода к использованию исключений.
Если бы он содержал например afx.h можно было бы что-то утверждать про твои CException.
Может ты сможешь мне показать хотя бы один проект, где используется CException (из MFC) внутри C++Builder проекта? Это могло бы послужить хорошим основанием в поддержку твоей версии.
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
код Dreablin не соджержит класса эксепшна
Сообщение #24. Ты его не смотрел? О каком вообще диалоге может идти речь, если ты тупо не читаешь того, что тебе пишут?
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Касательно MFC, с ним написана добрая часть ОС окна, что тебе не нравится?
Про "молоток-гвозди" ты похоже совсем ничего не понял. Не надо видеть MFC там, где его нет.
0
Dreablin
5 / 5 / 1
Регистрация: 05.02.2010
Сообщений: 124
23.03.2015, 17:16 #45
Срач я ваш почитал, но это не дало результат.
Сейчас актуальный вопрос - как сделать, что бы не было исключения при отсутствии ответа по истечении времени ожидания. Диспетчер задач (монитор ресурсов, если точнее) показывает кучу открытых соединений.
Либо где-то в Indy есть такая настройка
Либо использовать не Indy.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.03.2015, 17:16
Привет! Вот еще темы с ответами:

много памяти жрет игра на OpenGL - C++
много памяти жрет игра на OpenGL...через диспетчер смотрю аж 15 метров...там же ничего особого нету...или так и должно быть??? ...

Браузер Awesomium жрет память - C# WPF
Всем здравствуйте, у меня в программе используется компонент awesomium замечено что на некоторых сайтах (если долго открыт браузер) память...

Что то жрет оперативную память - Windows 7
мне посоветовали обратиться сюда насчет этой темыhttp://www.cyberforum.ru/viruses/thread1495290.html где мы не смогли найти решение может...

Отрисовка в таймере жрет память - OpenGL
Программа написанная на OpenGL понемногу, но непрерывно ест RAM. А именно после того как я юзаю таймер вида void Timer( int value ){...


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

Или воспользуйтесь поиском по форуму:
45
Yandex
Объявления
23.03.2015, 17:16
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru