1 / 1 / 0
Регистрация: 20.04.2013
Сообщений: 283
1

HEAP CORRUPTION DETECTED: after Normal block

29.10.2019, 17:41. Показов 3326. Ответов 3
Метки нет (Все метки)

добрый день.
пишу небольшую програмку которая собирает данные про все файлы в папке(и файлы что лежат в папке в папке и т.д. в общем ВСЕ файлы, а не только в корне указанной папки)
C++ (Qt)
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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
#define _CRT_SECURE_NO_WARNINGS 
 
#include <stdio.h>        // подключаем заголовочный файл stdio.h
#include <filesystem>
#include <string>
#include <iostream>
#include <sys/types.h>
#include <errno.h>
#include <vector>
#include <iostream>
#include <fstream>
#include <windows.h>
#include <windows.h>
#include <RestartManager.h>
#include <stdio.h>
#include <ctime>
#include "Hello.h"
#include <fstream>
#pragma comment(lib,"Rstrtmgr.lib")
using namespace std;
const string logfile = "C:\\log\\log.txt";
wchar_t pFolderPath[] = L"C:\\searchtest";
 
//const string logfile = "C:\\scrpt\\radio\\root\\log.txt";
//wchar_t pFolderPath[] = L"C:\\scrpt\\radio";
 
void showFileInfo(char* file)
{
    HANDLE fH;
    FILETIME ftWrite;
    FILETIME creationTime;
 
    SYSTEMTIME createTime;
    SYSTEMTIME updateTime;
 
    DWORD dwFileSize;
 
    fH = CreateFile(file, GENERIC_READ, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
    if (fH != INVALID_HANDLE_VALUE)
    {
 
        GetFileTime(fH, &creationTime, 0, 0);
        GetFileTime(fH, NULL, NULL, &ftWrite);
 
        FileTimeToSystemTime(&creationTime, &createTime);
        FileTimeToSystemTime(&ftWrite, &updateTime);
 
        unsigned long FileSize = 0;
        FileSize = GetFileSize(fH,  NULL);
    
 
        std::cout << file << "\n" << "Size=" << FileSize << "\t" << "Create=" << createTime.wDay << "." << createTime.wMonth << "." << createTime.wYear <<
            " " << createTime.wHour << ":" << createTime.wMinute << ":" << createTime.wSecond << "\t" << "Update=" << updateTime.wDay << "." << updateTime.wMonth << "." << updateTime.wYear <<
            " " << updateTime.wHour << ":" << updateTime.wMinute << ":" << updateTime.wSecond << std::endl;
        
 
        std::ofstream out(logfile, std::ios::app);
        if (out.is_open())
        {
            out << file << "\n" << "Size=" << FileSize << "\t" << "Create=" << createTime.wDay << "." << createTime.wMonth << "." << createTime.wYear <<
                " " << createTime.wHour << ":" << createTime.wMinute << ":" << createTime.wSecond << "\t" << "Update=" << updateTime.wDay << "." << updateTime.wMonth << "." << updateTime.wYear <<
                " " << updateTime.wHour << ":" << updateTime.wMinute << ":" << updateTime.wSecond<<"\n";
        }
        out.close();
        
        
        
        CloseHandle(fH);
    }
 
}
 
void showFiles(wchar_t* currentFolder)
{
    
    wstring curentFolderString(currentFolder);
    wchar_t r[] = L"\\*";//для входа в указанную папку
    wchar_t* pFolderPath = currentFolder;
    pFolderPath = wcscat(pFolderPath, r);
    
 
    WIN32_FIND_DATAW wfd;
 
    HANDLE const hFind = FindFirstFileW(pFolderPath, &wfd);
 
    setlocale(LC_ALL, "");
 
    if (INVALID_HANDLE_VALUE != hFind)
    {
        
        do
        {
            
 
            if ((wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == 0)//если файл
            {
                wstring filepathString = curentFolderString + L"\\" + &wfd.cFileName[0];
 
                
                //std::wstring s = filepathString;
                //const wchar_t* str = s.c_str();
                
            
                std::wstring str= filepathString;
                char* writable = new char[str.size() + 1];
                std::copy(str.begin(), str.end(), writable);
                writable[str.size()] = '\0'; // don't forget the terminating 0
 
                //std::wcout << "FILE=\t" << &wfd.cFileName[0] << "\t"<<writable<<std::endl;
                
                
                showFileInfo(writable);
                
                delete[] writable;
                
                
            }
            else //если папка
 
            {
                WCHAR* t = wfd.cFileName;
 
                if (t[0]!='.')//файлы НЕ начинаються на "." и ".."
                {
                    
                    wstring newpath = curentFolderString + L"\\"+ &wfd.cFileName[0];
                    //std::wcout << "FOLDER=\t" << &wfd.cFileName[0] <<std::endl; //вывод мнформации о папке
                    showFiles(&newpath[0]);
                }
 
                
            }
 
        } while (NULL != FindNextFileW(hFind, &wfd));
 
        FindClose(hFind);
    }
    
}
 
 
 
int main(void)                  
{
 
    std::ofstream out;          // поток для записи
    //out.open("C:\\log\\log.txt"); // окрываем файл для записи
    
    out.open(logfile); // окрываем файл для записи
    
    if (out.is_open())
    {
        out << "";
    }
    out.close();
 
    
    //wchar_t pFolderPath[] = L"C:\\searchtest";//корневая папка для поиска
    
    
    
    showFiles(pFolderPath);  // запуск логики поиска
    
     
    
    //char file[] = "C:\\my\\2.txt";
    //showFileInfo(file);
 
    system("pause");
    return 0;
}
Все хорошо,но при больших "деревьях" в папке вылезает "HEAP CORRUPTION DETECTED". Подскажите, как это пофиксить можно?
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.10.2019, 17:41
Ответы с готовыми решениями:

Heap corruption detected after normal block
выкидывает ошибку при попытке освободить память массива, делаю так: char **Items; ......

heap corruption detected after normal block
Помогите пожалуйста решить проблему. Мне нужно реализовать перемену мест элементов массива т.е:...

Heap corruption detected after normal block #980
Здравствуйте! Нужна ваша помощь. Как я понимаю, ошибка возникает во время работы функции Deriv(),...

Heap corruption detected: after normal block (#153) at 0x00345730
#ifndef COW_H__ #define COW_H__ class Cow { char name; char *hobby; double weight;...

3
Вездепух
Эксперт CЭксперт С++
10427 / 5697 / 1552
Регистрация: 18.10.2014
Сообщений: 14,055
29.10.2019, 17:49 2
Цитата Сообщение от Dimitrii Посмотреть сообщение
вылезает "HEAP CORRUPTION DETECTED"
Ну так у вас идет запись за пределы внешнего pFolderPath. currentFolder указывает на внешний pFolderPath. Никакого дополнительно места во внешнем pFolderPath нет. А вы к нему делаете wcscat

C++
1
2
wchar_t* pFolderPath = currentFolder;
pFolderPath = wcscat(pFolderPath, r);
Куда, по-вашему, должен "поместиться" этот wcscat?
0
zss
29.10.2019, 19:01
  #3

Не по теме:

Цитата Сообщение от Dimitrii Посмотреть сообщение
#include <stdio.h> // подключаем заголовочный файл stdio.h
#include <filesystem>
#include <string>
#include <iostream>
#include <sys/types.h>
#include <errno.h>
#include <vector>
#include <iostream>
#include <fstream>
#include <windows.h>
#include <windows.h>
#include <RestartManager.h>
#include <stdio.h>
#include <ctime>
#include "Hello.h"
#include <fstream>
Почему некоторые файлы вы включаете всего по 2 раза, может надо побольше? :)
Цитата Сообщение от Dimitrii Посмотреть сообщение
// подключаем заголовочный файл stdio.h
Покажите, где он нужен?

0
1 / 1 / 0
Регистрация: 20.04.2013
Сообщений: 283
30.10.2019, 11:53  [ТС] 4
Лишнее в начале виноват. Быстро набрасывал )

Добавлено через 28 минут
а как то пофиксить можно, подскажите. я немного изменил, чтоб не брало внешнюю
C++
1
2
3
4
5
6
7
8
9
wchar_t r[] = L"\\*";//для входа в указанную папку
    
    wchar_t* localpFolderPath = currentFolder;
    localpFolderPath = wcscat(localpFolderPath, r);
    
 
    WIN32_FIND_DATAW wfd;
 
    HANDLE const hFind = FindFirstFileW(localpFolderPath, &wfd);
Стало получше, но иногда все равно дуреет.
Я правильно понимаю, localpFolderPath тут ссылается на переменную, а не на значение просто, и поэтому эти ошибки идут?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.10.2019, 11:53
Помогаю со студенческими работами здесь

Найти причины возникновения ошибки "heap corruption detected after normal block #331" и исправить эту ошибку
добрый день,нужна ваша помощь. при выводе массива выдает такую ошибку &quot;heap corruption detected...

Heap corruption detected
Heap corruption на строке 93 при первом же выполнении цикла. Из-за чего? #include &lt;locale.h&gt; //...

HEAP CORRUPTION DETECTED
Собственно такую ошибку выдаёт: &quot;HEAP CORRUPTION DETECTED: after Normal block (#220) at 0x001970B8....

Heap Corruption detected (
что не правильно? запускаю и ошибка вылетает как на предидущей картинке template&lt;typename TT&gt;...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru