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

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

Восстановить пароль Регистрация
 
titans2011
293 / 254 / 43
Регистрация: 27.09.2010
Сообщений: 1,058
09.08.2012, 14:53     как исправить повреждением кучи #1
Всем привет. Имеется такой кусок кода, который читает в условном формате дату из реестра и сохраняет её в структуру, где есть 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];
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.08.2012, 14:53     как исправить повреждением кучи
Посмотрите здесь:

Границы кучи C++
C++ Повреждение кучи
Повреждение кучи C++
Ошибка кучи C++
C++ Повреждение кучи
C++ Ошибка кучи
Повреждение кучи C++
C++ Получать различные начала кучи при создании кучи внутри цикла

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

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

Текущее время: 11:21. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru