С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/6: Рейтинг темы: голосов - 6, средняя оценка - 5.00
191 / 50 / 10
Регистрация: 27.09.2013
Сообщений: 516
Записей в блоге: 4

Ошибки при освобождении памяти

26.10.2015, 03:18. Показов 1240. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В приложении обрабатывается сообщение WM_DROPFILES, при попытке удаления строк szFileNameA и szFileNameW вылетает ошибка "HEAP CURRUPTION DETECTED". Подскажите, как с этим можно бороться.

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
    case WM_DROPFILES:
    {
        auto hDrop = HDROP(wParam);
        auto nBufSize = DragQueryFile(hDrop, 0, nullptr, 0) + 1; //получение длины файла
        auto szFileNameA = new char[nBufSize]; 
        int dwCount = DragQueryFileA(hDrop, 0xFFFFFFFF, szFileNameA, nBufSize); //получение количества файлов
 
        for (auto i = 0; i < dwCount; i++)
        {
            DragQueryFileA(hDrop, i, szFileNameA, MAX_PATH);
            auto szFileNameW = new wchar_t[nBufSize];
            MultiByteToWideChar(CP_ACP, 0, szFileNameA, -1, szFileNameW, wcslen(szFileNameW));
 
            FindFiles(szFileNameW); //рекурсивный поиск файлов
 
            auto bWnd = GetDlgItem(hWnd, CTL_PLAYBTN);
            EnableWindow(bWnd, true);
            bWnd = GetDlgItem(hWnd, CTL_BTNCLR);
            EnableWindow(bWnd, true);
            bWnd = GetDlgItem(hWnd, CTL_BTNDEL);
            EnableWindow(bWnd, true);
 
            delete[] szFileNameW; //ошибка
        }
        delete[] szFileNameA; //ошибка
        DragFinish(hDrop);
    }
    break;
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
26.10.2015, 03:18
Ответы с готовыми решениями:

new и delete при освобождении памяти
Здравствуйте. Скажите, пожалуйста что я неправильно делаю. При освобождении памяти. Выделяем память: char **VIRTUAL = NULL; if...

Ошибка при освобождении памяти
Все идет замечательно, но вот когда происходит удаление массива программа крашится.. #include &lt;iostream&gt; using namespace...

Ошибка при освобождении памяти
Добрый День! Написал простую программу для понимания сути. Проблема в том, что код, который прилагается выдает ошибку. Но если убрать...

3
1779 / 757 / 153
Регистрация: 03.06.2009
Сообщений: 5,940
26.10.2015, 10:54
Такое обычно выдает когда программа изменяет память вне выделенных блоков. К примеру, выделен буфер на 512, а программа записала больше 512 байт. Бороться с этим можно только внимательно следя сколько памяти выделяется и как она используется.
0
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,531
Записей в блоге: 1
26.10.2015, 11:33
Лучший ответ Сообщение было отмечено artemka2008 как решение

Решение

возможно szFileNameA = new char[nBufSize];
и одновременно DragQueryFileA(hDrop, i, szFileNameA, MAX_PATH);
когда nBufSize меньше MAX_PATH
последнее значение в DragQueryFileA должно соответствовать реально выделенному размеру буфера.
1
191 / 50 / 10
Регистрация: 27.09.2013
Сообщений: 516
Записей в блоге: 4
26.10.2015, 15:11  [ТС]
Проблему решил, вот рабочий код с комментариями
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
case WM_DROPFILES:
    {
        auto hDrop = HDROP(wParam);
        int dwCount = DragQueryFile(hDrop, 0xFFFFFFFF, nullptr, 0);  //количество файлов
 
        for (auto i = 0; i < dwCount; i++)
        {
            auto nBufSize = DragQueryFile(hDrop, i, nullptr, 0) + 1; //получение длины конкретного файла
            auto szFileNameW = new wchar_t[nBufSize]; //переменная для хранения имени
            DragQueryFile(hDrop, i, szFileNameW, nBufSize); // получение имени файла
 
            FindFiles(szFileNameW); //рекурсивный поиск файлов
 
            auto bWnd = GetDlgItem(hWnd, CTL_PLAYBTN);
            EnableWindow(bWnd, true);
            bWnd = GetDlgItem(hWnd, CTL_BTNCLR);
            EnableWindow(bWnd, true);
            bWnd = GetDlgItem(hWnd, CTL_BTNDEL);
            EnableWindow(bWnd, true);
 
            delete[] szFileNameW; //освобождение выделенной памяти
        }
        DragFinish(hDrop);
    }
    break;
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
26.10.2015, 15:11
Помогаю со студенческими работами здесь

Ошибка при освобождении памяти
Здравствуйте! Пишу на MS Visual C++ 2010, windows 7. При вызове функции resize() на строке delete arr; происходит ошибка,...

Ошибка при освобождении памяти
Короче, есть простенький метод класса, в котором за полем под названием ID закрепляется новое айди. При это память, в которой хранилось...

Ошибка при освобождении памяти
#include &lt;iostream&gt; using namespace std; #include &lt;stdlib.h&gt; #include &lt;fstream&gt; #include &lt;stdio.h&gt; void *malloc (size_t...

Исключение при освобождении памяти
Как ловить ошибки, типа: int* a = new int; for(int i = 0; i &lt; 5; ++i) a = 1; delete a;в 4-ой строке вылезит ошибка, при этом в...

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


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и источниками (напряжения, ЭДС и тока). Найти токи и напряжения во всех элементах. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru