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

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

Войти
Регистрация
Восстановить пароль
 
titans2011
296 / 257 / 43
Регистрация: 27.09.2010
Сообщений: 1,058
#1

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

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

Всем привет. Имеется такой кусок кода, который читает в условном формате дату из реестра и сохраняет её в структуру, где есть 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++
Как корректно определить границы кучи в любой момент времени без использования функций менеджера дрп в си? Добавлено через 18 часов 7...

Повреждение кучи - C++
Приветствую! Сделал, казалось бы, простую программу, но у меня возникает ошибка на самом ровном месте: void print(node** graph, int V) ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.08.2012, 14:53
Привет! Вот еще темы с ответами:

Ошибка кучи - C++
Выдает ошибку: &quot;ОС Windows инициировала точку останова в Lab2.exe.Это может быть вызвано повреждением кучи и указывает на ошибку в Lab2.exe...

Повреждение кучи - C++
Есть код #include &lt;iostream&gt; using namespace std; struct STUDENT { char NAME; int GROUP; int SES; };

Повреждние кучи - C++
Понимаю, тема стара как мир, но похожих случаев не нашел, к сожалению. Есть консольное приложение, в котором реализуется СУБД библиотеки...

Размер кучи - C++
С помощью какой библиотечной ф-ции или как узнать размер кучи в языке Си?


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

Или воспользуйтесь поиском по форуму:
Ответ Создать тему
Опции темы

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