Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.89/55: Рейтинг темы: голосов - 55, средняя оценка - 4.89
Ko
5 / 5 / 2
Регистрация: 23.12.2011
Сообщений: 282
1

Падает то не падает) APPCRASH StackHash PCH FROM ntdll

29.06.2013, 16:35. Показов 10102. Ответов 22
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
При работе приложения вызывается метод класса и с вероятностью 50/50 программа доживает до конца своей работы
при падении выдаётся вот такое

Сигнатура проблемы:
Имя события проблемы: APPCRASH
Имя приложения: XXX.exe
Версия приложения: 0.0.0.0
Отметка времени приложения: 51cea425
Имя модуля с ошибкой: StackHash_69fe
Версия модуля с ошибкой: 6.2.9200.16384
Отметка времени модуля с ошибкой: 5010acd2
Код исключения: c0000374
Смещение исключения: PCH_78_FROM_ntdll+0x0000000000002BEA
Версия ОС: 6.2.9200.2.0.0.256.48
Код языка: 1049
Дополнительные сведения 1: 69fe
Дополнительные сведения 2: 69fe067f15cbd711de9a06a551d3dadd
Дополнительные сведения 3: f975
Дополнительные сведения 4: f975cbc478b921e800650d05b62c8dd7

Ознакомьтесь с заявлением о конфиденциальности в Интернете:
http://go.microsoft.com/fwlink/?linkid=190175

Памяти приложение жрет в районе 1-3 гигов

вот кусок кода где падает
смысл этого метода это добавление в картатеку определенного номера
по ходу дела когда размер массива "Fast_Cross_Size_Max" превышает то выделяется больше кусок памяти
начальное значение Fast_Cross_Size_Max = 5 у Fast_Cross_Size = 0

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
void Element::Add_New_Cross_Сompatible( unsigned int &_Add_Cross_ )
{
    if ( Fast_Cross_Size < Fast_Cross_Size_Max-1 )
    {
        Fast_Cross_Сompatible[Fast_Cross_Size] = _Add_Cross_;
        Fast_Cross_Size++;
    }
    else
    {
        Fast_Cross_Size_Max *= 2;
        unsigned int *temp_fast = new unsigned int[Fast_Cross_Size_Max];
        for (int i = 0; i < Fast_Cross_Size; i++)
        {
            temp_fast[i] = Fast_Cross_Сompatible[i];
        }
        delete[]Fast_Cross_Сompatible; <= падает тут когда я вытаюсь удалить эту памяти. почему я не могу понять
        Fast_Cross_Сompatible = new unsigned int[Fast_Cross_Size_Max];
        for (int i = 0; i < Fast_Cross_Size; i++)
        {
            Fast_Cross_Сompatible[i] = temp_fast[i];
        }
        Fast_Cross_Сompatible[Fast_Cross_Size] = _Add_Cross_;
        Fast_Cross_Size++;
        delete[]temp_fast;
    }
}
в компе 20 гигов памяти, память уже 10 раз проверял error не обнаружено, программа неделями работала пока я не добавил вот этот кусок кода, пожалуйста выскажитесь по этому поводу что думаете
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.06.2013, 16:35
Ответы с готовыми решениями:

ребятки APPcrash и stackhash
При запуске любой проги вот такая борода APPcrash и stackhash выскакивает чо делать

Jquery падает на ie 7-8
Добрый день. В 9-й версии все работает отлично(собственно как и на других браузерах). Но, при...

Падает текст в IE 8-9
Всем доброго времени суток. столкнулся с такой проблемой. Как всегда Осел радует. вот что должно...

падает сайт
с помощью ajax`а обращаюсь к коду каждую секунду,проверя наличие новых сообщений если заходит 2...

22
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
30.06.2013, 15:36 2
Почему бы не использовать стандартные контейнеры?
0
Ko
5 / 5 / 2
Регистрация: 23.12.2011
Сообщений: 282
01.07.2013, 04:04  [ТС] 3
скорость в 4-6 раз падает
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
01.07.2013, 04:07 4
Скорее всего где-то попортили память, пытаясь записать не в свою память
0
Ko
5 / 5 / 2
Регистрация: 23.12.2011
Сообщений: 282
01.07.2013, 06:32  [ТС] 5
Я решил проверсти тесты и кое какие манипуляции скорей всего идеально будет всё таки воспозоваться стандарными средствами но пожертвовать скоростью. Если память портиться то почему из 10 раз 5 раз всё получается а 5 не получается софтине дойти до конца.
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
01.07.2013, 06:35 6
Цитата Сообщение от Ko Посмотреть сообщение
почему из 10 раз 5 раз всё получается
При ошибках в работе с памятью результат зависит от фазы луны и от великого рандома
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
01.07.2013, 07:26 7
К проблеме отношения не имеет, но зачем:
C++
1
2
3
4
5
6
7
...
Fast_Cross_Сompatible = new unsigned int[Fast_Cross_Size_Max];
for (int i = 0; i < Fast_Cross_Size; i++)
{
       Fast_Cross_Сompatible[i] = temp_fast[i];
}
...
если можно просто:
C++
1
Fast_Cross_Сompatible = temp_fast;
0
Ko
5 / 5 / 2
Регистрация: 23.12.2011
Сообщений: 282
01.07.2013, 07:37  [ТС] 8
Луну исключаем)

Добавлено через 54 секунды
Вы хотите сказать что машина сама скопирует Fast_Cross_Сompatible = temp_fast; все значения ?

Добавлено через 1 минуту
я бы конечно стал бы использовать Stl вектор, но хочется очень понять почему идут завесы
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
01.07.2013, 07:39 9
Цитата Сообщение от Ko Посмотреть сообщение
Вы хотите сказать что машина сама скопирует Fast_Cross_Сompatible = temp_fast; все значения ?
При чём здесь значения? Значения уже скопированы:
C++
1
2
3
4
5
unsigned int *temp_fast = new unsigned int[Fast_Cross_Size_Max];
for (int i = 0; i < Fast_Cross_Size; i++)
{
       temp_fast[i] = Fast_Cross_Сompatible[i];
}
Нужно только указатель на эту память заменить.
C++
1
Fast_Cross_Сompatible = temp_fast;
Теперь на эту память указывает Fast_Cross_Сompatible.
0
Ko
5 / 5 / 2
Регистрация: 23.12.2011
Сообщений: 282
01.07.2013, 07:41  [ТС] 10
Ребята спасибо что Вы помогаете)
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
01.07.2013, 07:42 11
И естественно, delete[]temp_fast; после этого уже не делать.
0
Ko
5 / 5 / 2
Регистрация: 23.12.2011
Сообщений: 282
01.07.2013, 07:45  [ТС] 12
а ну я это делал именно так в самом начале когда начались завесы, потом переделал) сейчас сделал файл 6 гигов его подгружаю ни когда до конца программа не доходит, это положительно в поиске истины

Добавлено через 1 минуту
сейчас подифицируем и поглядим, жаль что в разных местах падает программа так было бы проще но менее интересно)

Добавлено через 1 минуту
а может стэка не хватать?
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
01.07.2013, 07:48 13
Цитата Сообщение от Ko Посмотреть сообщение
а ну я это делал именно так в самом начале когда начались завесы, потом переделал)
А смысл было переделывать? То же самое, только дополнительное выделение, копирование и освобождение.

Добавлено через 42 секунды
Цитата Сообщение от Ko Посмотреть сообщение
а может стэка не хватать?
А где здсь стек? В куче память выделяется, но там тоже есть ограничение.
1
Ko
5 / 5 / 2
Регистрация: 23.12.2011
Сообщений: 282
01.07.2013, 08:24  [ТС] 14
Хотел сделать тестовый блок как в программе, сделал, пару раз прогнал, прога не зависает тестовая, это уже интересно
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
01.07.2013, 09:04 15
Посмотреть сколько ОС позволяет памяти выделить для программы. Выделять вектор и смотреть при каком размере будет исключение. У меня, при 4Гб памяти, не больше этого (1.2 Гб):
C++
1
std::vector <int> vec(330000000);
0
Ko
5 / 5 / 2
Регистрация: 23.12.2011
Сообщений: 282
01.07.2013, 09:27  [ТС] 16
16-20 гигов программа может поглотить при работе, вектор это будет крайний случай потому что это очень медленно, 31 секунда вектора против 19 секунд без вектора, меньше не не удаётся согратить время вектора

Добавлено через 3 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void Element_test::Add_New_Cross_Сompatible( unsigned int &_Add_Cross_ )
{
    if ( Fast_Cross_Size < Fast_Cross_Size_Max-1 )
    {
        Fast_Cross_Сompatible[Fast_Cross_Size] = _Add_Cross_;
        Fast_Cross_Size++;
    }
    else
    {
        Fast_Cross_Size_Max *= 2;
        unsigned int *temp_fast = new unsigned int[Fast_Cross_Size_Max];
        for ( unsigned int i = 0; i < Fast_Cross_Size; i++)
        {
            temp_fast[i] = Fast_Cross_Сompatible[i];
        }
        delete[]Fast_Cross_Сompatible;
        Fast_Cross_Сompatible = temp_fast;
        Fast_Cross_Сompatible[Fast_Cross_Size] = _Add_Cross_;
        Fast_Cross_Size++;
    }
}

при таком коде думаешь не будет утечки памяти к temp_fast ведь выделяется там указатель, это пусть 4 байта или сколько там он выделяет то это если сделать 1 миллиард раз будет 4 миллиарда байтов заблокировано( хотя я тесты делал вроде нет утечки, но это односложный тест был
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
01.07.2013, 10:07 17
Цитата Сообщение от Ko Посмотреть сообщение
31 секунда вектора против 19 секунд без вектора
Очень странно. Может Вы с отладочной инфой собираете?
0
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
01.07.2013, 10:27 18
Можно сделать чуть проще:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void Element_test::Add_New_Cross_Сompatible( unsigned int _Add_Cross_ )
{
   if ( Fast_Cross_Size >= Fast_Cross_Size_Max ) {
      Fast_Cross_Size_Max *= 2;
      
      unsigned int *tmp  = new unsigned int [ Fast_Cross_Size_Max ];
      
      std::memcpy( tmp, Fast_Cross_Сompatible, Fast_Cross_Size * sizeof( unsigned int ));
      
      delete [] Fast_Cross_Сompatible;
      
      Fast_Cross_Сompatible = tmp;
   }
 
   Fast_Cross_Сompatible[ Fast_Cross_Size++ ] = _Add_Cross_;
}
Но проблема вряд ли в этой функции. Какой тип имеют переменные размеров? Если Вы говорите, что программа использует больше 4 гб памяти, то лучше использовать size_t.

Добавлено через 6 минут
Tulosba, мне кажется, что просто не используется push_back().
Ko, с вектором Вам бы не нужно было хранить максимальный и текущий размер массива. А данная функция бы свелась к простому:
C++
1
2
3
4
void Element_test::Add_New_Cross_Сompatible( unsigned int _Add_Cross_ )
{
   vec.push_back( _Add_Cross_ );
}
1
Ko
5 / 5 / 2
Регистрация: 23.12.2011
Сообщений: 282
01.07.2013, 10:51  [ТС] 19
для кода возьму строчку
std::memcpy( tmp, Fast_Cross_Сompatible, Fast_Cross_Size * sizeof( unsigned int ));
вектор и всё что с ним связано это всё понятно, но это последний вариант и он очень медленный для программ которые работают недели или месяцы не допустим проигрыш почти в два раза по времени если использовать
vec.push_back( _Add_Cross_ ); время с 19 секунд превращается в 78 секунд, если вектор в начале раздвигать как надо то можно сделать чтоб время было районе 31 секунду и это использовать компилятор от intel

Добавлено через 37 секунд
я думаю что в коде как раз всё нормально, может в настройках компилятора что не то... буду пробывать, всем спасибо

Добавлено через 1 минуту
диапазон все чисел от 0 до 160000.. это предел так что unsigned int за глаза
0
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
01.07.2013, 11:18 20
Ko, даже не поленился, прогнал небольшой тест. Вектор оказался быстрее примерно в 1.3 раза. Компилятор MinGW, -O2.
ADD: Но в 2010 и 2005 студиях действительно есть небольшое падение скорости.

Добавлено через 1 минуту
Цитата Сообщение от Ko Посмотреть сообщение
диапазон все чисел от 0 до 160000.. это предел так что unsigned int за глаза
Это предел хранимых значений. Значения уникальны? То есть их количество не может быть больше 160000 в массиве?
0
01.07.2013, 11:18
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.07.2013, 11:18
Помогаю со студенческими работами здесь

Падает статистика
Собственно создал эту тему с целью услышать мысли людей которые в SEO разбираются. Есть сайт ...

Падает программа
Здравствуйте. Нужно написать программу, которая последовательно отображает два экрана. На первом...

Падает Сервер
Добрый день, Domino 7.0 6 лет простоял стабильно с недавнего времени начал падать, падает в разное...

Падает Raid 5
Параметры моего ПК: MB: Asus P6T Deluxe V2 CPU: Intel Core i7 930 VC: Sapphire HD 5870 2GB...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru