Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
8 / 2 / 0
Регистрация: 28.11.2017
Сообщений: 157
1

Краш при освобождении памяти через HeapFree()

19.02.2020, 20:14. Показов 601. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
написал этот код, который находит расширение файла.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
LPWSTR findExtension(LPCWSTR fileName) 
{
    int pos = findchr(fileName, L"."); // поиск точки с конца строки
    
    if (pos != -1) { // если нашлась точка
        int lenght = lstrlenW(fileName); // размер строки
        wchar_t* extension = (wchar_t*)HeapAlloc(GetProcessHeap(), NULL, sizeof(wchar_t) * (lenght - pos + 1)); // выделение памяти под массив
 
        for (int i = 0; i < lenght - pos; i++)
        {
            extension[i] = fileName[pos + 1 + i]; // после точки по одному символу в массив
        }
        extension[lenght - pos] = 0; // конец строки
        LPWSTR ret = extension; // возращаемая строка
        
        HeapFree(GetProcessHeap(), NULL, &extension); // освобождаю указатель, иначе ret также сотрется, но происходит краш
        MessageBoxA(NULL, "", NULL, SW_SHOW); // не доходит до этого момента
        return ret; // возращаю строку
    }
}
вопрос, как освободить память, дабы не было утечки?

P.S.
Если использовать HeapFree() вот так:
C++
1
HeapFree(GetProcessHeap(), NULL, extension);
тогда строка ret удаляется...
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.02.2020, 20:14
Ответы с готовыми решениями:

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

Ошибка при освобождении памяти
#include &lt;iostream&gt; using namespace std; int main() { int a=32; int *ptr=&amp;a; delete ptr;

Ошибка при освобождении памяти
MS Visual 2010 Express OS: Windows Vista Написал следующий код: LPWSTR CurrentLanguage;...

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

6
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
19.02.2020, 20:37 2
Цитата Сообщение от korozyan Посмотреть сообщение
Если использовать HeapFree() вот так:
C++Выделить код
1
HeapFree(GetProcessHeap(), NULL, extension);
тогда строка ret удаляется...
Потому что это правильно, иначе ты пытаешься удалить указатель на указатель на строку.

Добавлено через 1 минуту
Цитата Сообщение от korozyan Посмотреть сообщение
return ret; // возращаю строку
Здесь ты возвращаешь строку, которую только что удалил
0
8 / 2 / 0
Регистрация: 28.11.2017
Сообщений: 157
19.02.2020, 20:38  [ТС] 3
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Потому что это правильно, иначе ты пытаешься удалить указатель на указатель на строку.
как тогда сохранить строку и освободить память?
0
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
19.02.2020, 20:39 4
Цитата Сообщение от korozyan Посмотреть сообщение
как тогда сохранить строку и освободить память?
Воспользуйся std::wstring
0
8 / 2 / 0
Регистрация: 28.11.2017
Сообщений: 157
19.02.2020, 20:40  [ТС] 5
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Воспользуйся std::wstring
использовать библиотеку <string> нельзя. использую только винапи в приложении. никакого CRT
0
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
19.02.2020, 20:42 6
C++
1
std::wstring findExtension(LPCWSTR fileName) .............
Добавлено через 1 минуту
Цитата Сообщение от korozyan Посмотреть сообщение
использовать библиотеку <string> нельзя. использую только винапи в приложении. никакого CRT
Тогда лучше буфер выделять снаружи
C++
1
void findExtension(LPCWSTR fileName, LPWSTR ext)
1
Эксперт CЭксперт С++
5113 / 4552 / 854
Регистрация: 07.10.2015
Сообщений: 9,462
19.02.2020, 21:23 7
Ещё есть LocalAlloc(), GlobalAlloc().
Не забывать потом освободить память.
0
19.02.2020, 21:23
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.02.2020, 21:23
Помогаю со студенческими работами здесь

Ошибки при освобождении памяти
В приложении обрабатывается сообщение WM_DROPFILES, при попытке удаления строк szFileNameA и...

Ошибка при освобождении памяти
Задача: Из стандартного входного потока вводятся сроки. Признаком завершения каждой сроки является...

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

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


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

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