Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
320 / 280 / 109
Регистрация: 27.09.2010
Сообщений: 1,058
1

как исправить повреждением кучи

09.08.2012, 14:53. Показов 835. Ответов 0
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем привет. Имеется такой кусок кода, который читает в условном формате дату из реестра и сохраняет её в структуру, где есть SYSTEMTIME:
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
    TCHAR * timeT=new TCHAR[35];//главные виновники, из-за низ вылетает в конце кода программа
    TCHAR * TempTimeT=new TCHAR[8];
    len=MAX_PATH;
    ZeroMemory(NUMBER, 15);//очищаем и создаем имя, по которому обратимся в реестр
    ZeroMemory(Name, 20);
    wcscat(Name,L"Task");
    _itow(i,NUMBER,10);
    wcscat(Name,NUMBER);
    wcscat(Name,L"stamp");
    ZeroMemory(timeT, 35);
    Result=RegQueryValueEx(key, Name, 0, 0, (BYTE*)timeT, &len);//читаем с реестра дату
    ZeroMemory(TempTimeT, 8);
    int ae=0; int indH=0;
    for (int j=0; j<25; j++)
        {
            if (timeT[j]==NULL)
                {
                    memmove((TempTimeT),timeT+indH,sizeof(TempTimeT[0])*(j-indH));
                                        //возможно тут выход за пределы
                    temp.stamp.wYear=_tstoi(TempTimeT);
                    ZeroMemory(TempTimeT, 8);
                     break;
                }
            if (timeT[j]=='.')//если встречается разделитель, то записываем дату в нужное место
                {
                    ZeroMemory(TempTimeT, 8);
                    memmove((TempTimeT),timeT+indH,sizeof(TempTimeT[0])*(j-indH));
                                        //возможно тут выход за пределы
                    switch (ae)
                    {
                        case (0): 
                            temp.stamp.wHour=_tstoi(TempTimeT); 
                            ZeroMemory(TempTimeT, 8);  
                            ae++; 
                            break;
                        case (1): 
                            temp.stamp.wMinute=_tstoi(TempTimeT); 
                            ZeroMemory(TempTimeT, 8);  
                            ae++; 
                            break;
                        case (2): 
                            temp.stamp.wSecond=_tstoi(TempTimeT); 
                            ZeroMemory(TempTimeT, 8);  
                            ae++; 
                            break;
                        case (3): 
                            temp.stamp.wMilliseconds=_tstoi(TempTimeT); 
                            ZeroMemory(TempTimeT, 8);  
                            ae++; 
                            break;
                        case (4): 
                            temp.stamp.wDay=_tstoi(TempTimeT); 
                            ZeroMemory(TempTimeT, 8);  
                            ae++; 
                            break;
                        case (5): 
                            temp.stamp.wDayOfWeek=_tstoi(TempTimeT); 
                            ZeroMemory(TempTimeT, 8);  
                            ae++; 
                            break;
                        case (6): 
                            temp.stamp.wMonth=_tstoi(TempTimeT); 
                            ZeroMemory(TempTimeT, 8);  
                            ae++; 
                            break;
                        case (7):
                            temp.stamp.wYear=_tstoi(TempTimeT); 
                            ZeroMemory(TempTimeT, 8);  
                            ae++; 
                            break;
                    };
                    indH=j+1;//делаем смещение, начиная со следующего знака
                }
            }
    ZeroMemory(TempTimeT, 8);
    ZeroMemory(timeT, 35);
    delete [] TempTimeT;//тут программа вылетает с ошибкой
    delete [] timeT;
Ошибка выходит такая:
ОС Windows инициировала точку останова в WaitableTimer.exe.

Это может быть вызвано повреждением кучи и указывает на ошибку в WaitableTimer.exe или в одной из загруженных им DLL.

Возможной причиной так же может быть нажатие пользователем клавиши F12, когда фокус принадлежит WaitableTimer.exe

Выведенное на экран окно содержит дополнительные данные для диагностики ошибки

Я почитал, что это может быть, если вылезти за размер памяти, например вот это меня смущает memmove((TempTimeT),timeT+indH,sizeof(TempTimeT[0])*(j-indH)); Тут все правильно? Повторения имен не может быть, я проверил.

Добавлено через 1 час 16 минут
Проблему решил увеличением буфера до TCHAR[300];
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.08.2012, 14:53
Ответы с готовыми решениями:

Исправить ошибку повреждения кучи
Т.к. самостоятельно изучаю с++ нужна ваша помощь, а именно: пожалуйста,помогите исправить ошибку...

Получать различные начала кучи при создании кучи внутри цикла
Можно ли как-то такое провернуть, чтобы на каждой итерации цикла получались различные адреса...

Обменяют ли наушники с таким повреждением?
Купил наушники 22 ноября. Гарантия две недели. Пару дней назад они рассыпались. Кнопочка для...

Разбить камни на две кучи так, чтобы вес одной кучи не превышал веса другой более критической массы
Здраствуйте,уважаемые програмисты!Проблемы с задачкой Условие:Есть куча камней,каждый камень имеет...

0
09.08.2012, 14:53
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.08.2012, 14:53
Помогаю со студенческими работами здесь

Нахождение максимального элемента кучи, добавление элемента, удаление элемента из кучи
Дано бинарное дерево-куча. Нужно найти максимальный элемент (корень дерева), добавить новый...

Как избавиться от кучи if?
Приветствую! Делаю парсинг однотипных сайтов. Есть длинный список тегов, которые надо получить....

Как оценить объём кучи
Как оценить объём кучи при динамическом выделении памяти? Чтобы проверить можно ли добавлять в...

Как избежать использования кучи проверок?
В общем есть файл конфига, в котором хранятся переменные, так вот, я хотел бы узнать, можно ли...


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

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