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

Правильно ли очищается память?

20.02.2020, 14:59. Показов 877. Ответов 18
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
имеется структура
C++
1
2
3
typedef struct {
    LPCWSTR letter;
} structura;
объявляю из функции саму структуру, задаю letter и вывожу сообщение
C++
1
2
3
4
structura* struc = (structura*)HeapAlloc(GetProcessHeap(), NULL, sizeof(structura));
    struc->letter = L"asdsadasd";
 
    MessageBoxW(NULL, struc->path, NULL, SW_SHOW);
после закрытия сообщения, вот такая маза:
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
20.02.2020, 14:59
Ответы с готовыми решениями:

Правильно ли очищается память?
сть программа которая работает с динамическим массивом. работает она так: int** a = new int*; for(int i=0; i<nl i++) a = new...

Динамические массивы: очищается ли память?
Здравствуйте. Подскажите, пожалуйста, по поводу динамических массивов. Допустим, есть вот такой код: int *massive = new int; int...

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

18
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
20.02.2020, 15:09
Цитата Сообщение от korozyan Посмотреть сообщение
правильно ли очищается память?
А где ты здесь очищаешь память? Покажи нормальный код
0
8 / 2 / 0
Регистрация: 28.11.2017
Сообщений: 157
20.02.2020, 15:11  [ТС]
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
А где ты здесь очищаешь память? Покажи нормальный код
блин, название темы автоматически поставилось с предыдущего вопроса... правильно будет:
краш при определении структуры
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
20.02.2020, 15:13
Цитата Сообщение от korozyan Посмотреть сообщение
блин, название темы автоматически поставилось с предыдущего вопроса... правильно будет:
краш при определении структуры
Тем не менее - что такое struc->path?
0
8 / 2 / 0
Регистрация: 28.11.2017
Сообщений: 157
20.02.2020, 15:50  [ТС]
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Тем не менее - что такое struc->path?
забыл изменить на letter...
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
20.02.2020, 15:57
Цитата Сообщение от korozyan Посмотреть сообщение
забыл изменить на letter...
Похоже, что-то ты ещё забыл. Ошибка где-то в другом месте.
0
8 / 2 / 0
Регистрация: 28.11.2017
Сообщений: 157
20.02.2020, 18:29  [ТС]
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Похоже, что-то ты ещё забыл. Ошибка где-то в другом месте.
после мессадж бокса только
C++
1
ExitProcecess(0);
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
20.02.2020, 20:00
Цитата Сообщение от korozyan Посмотреть сообщение
после мессадж бокса только
C++Выделить код
1
ExitProcecess(0);
Ну, во-первых - я знаю случаев, когда бы мог понадобиться ExitProcecess(0) (вернее, ExitProcess - ты даже здесь умудрился неправильно написать)
Во-вторых, покажи весь код. Просто скопируй через буфер обмена, не надо своими словами пересказывать.
0
8 / 2 / 0
Регистрация: 28.11.2017
Сообщений: 157
20.02.2020, 21:20  [ТС]
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Ну, во-первых - я знаю случаев, когда бы мог понадобиться ExitProcecess(0) (вернее, ExitProcess - ты даже здесь умудрился неправильно написать)
Во-вторых, покажи весь код. Просто скопируй через буфер обмена, не надо своими словами пересказывать.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <windows.h>
 
typedef struct {
    LPCWSTR path;
} structura;
 
void main() {
    structura* struc = (structura*)HeapAlloc(GetProcessHeap(), NULL, sizeof(structura));
    struc->path = L"asdsadasd";
 
    MessageBoxW(NULL, struc->path, NULL, SW_SHOW);
    ExitProcess(0);
}
Добавлено через 4 минуты
если на Win 8.1 запускать, то никакой ошибки нет. Если на XP, то появляется ошибка...
0
Эксперт CЭксперт С++
 Аватар для liv
5120 / 4573 / 855
Регистрация: 07.10.2015
Сообщений: 9,462
20.02.2020, 21:24
korozyan, может, все же так записать?
C++
7
int main() {
1
8 / 2 / 0
Регистрация: 28.11.2017
Сообщений: 157
20.02.2020, 21:26  [ТС]
странно, нор это помогло. спасибо!
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
20.02.2020, 21:27
Цитата Сообщение от korozyan Посмотреть сообщение
если на Win 8.1 запускать, то никакой ошибки нет. Если на XP, то появляется ошибка...
Убери ExitProcess(0); (и никогда им не пользуйся).
C++
1
2
3
4
5
6
7
8
void main() {
    structura* struc = (structura*)HeapAlloc(GetProcessHeap(), NULL, sizeof(structura));
    struc->path = L"asdsadasd";
 
    MessageBoxW(NULL, struc->path, NULL, SW_SHOW);
 
    HeapFree(GetProcessHeap(), 0, struc);
}
0
8 / 2 / 0
Регистрация: 28.11.2017
Сообщений: 157
20.02.2020, 22:35  [ТС]
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Убери ExitProcess(0); (и никогда им не пользуйся).
еще вопрос, приложение крашится, когда я передаю структуру при создании потока:

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
typedef struct {
    LPCWSTR path;
} structura;
 
DWORD WINAPI ListAllDrives(LPVOID param)
{
    structura temp = *((structura*)param);
    
    MessageBoxW(NULL, temp.path, NULL, SW_SHOW);
    return 0;
}
 
void AllocateThreads() 
{
    DWORD cchBuffer;
    WCHAR* driveStrings;
    UINT driveType;
    DWORD thrid = 0;
 
    cchBuffer = GetLogicalDriveStringsW(0, NULL);
    driveStrings = (WCHAR*)HeapAlloc(GetProcessHeap(), NULL, (cchBuffer + 1) * sizeof(TCHAR));
    GetLogicalDriveStringsW(cchBuffer, driveStrings);
 
    HANDLE thr[26];
    structura* struc = (structura*)HeapAlloc(GetProcessHeap(), NULL, sizeof(structura));
    
    while (*driveStrings)
    {
        driveType = GetDriveTypeW(driveStrings);
        if (driveType == DRIVE_FIXED) {
            struc->path = driveStrings;
            thr[thrid] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ListAllDrives, (LPVOID)struc, 0, NULL);
            Sleep(500);
        }
        else if (driveType == DRIVE_REMOVABLE) {
            struc->path = driveStrings;
            thr[thrid] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ListAllDrives, (LPVOID)struc, 0, NULL);
            Sleep(500);
        }
        else if (driveType == DRIVE_REMOTE) {
            struc->path = driveStrings;
            thr[thrid] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ListAllDrives, (LPVOID)struc, 0, NULL);
            Sleep(500);
        }
 
        thrid += 1;
        driveStrings += lstrlenW(driveStrings) + 1;
    }
 
    for (int i = 0; i < thrid; i++) {
        WaitForSingleObject(thr[i], INFINITE);
    }
}
в чем может быть проблема?
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
21.02.2020, 09:25
Цитата Сообщение от korozyan Посмотреть сообщение
в чем может быть проблема?
В том, что structura* struc = (structura*)HeapAlloc надо делать перед каждым вызовом CreateThread, а в функции потока делать HeapFree

C++
1
2
3
4
5
6
7
8
9
10
11
12
      if (driveType == DRIVE_FIXED) {
 structura* struc = (structura*)HeapAlloc(GetProcessHeap(), NULL, sizeof(structura));
 
            struc->path = driveStrings;
            thr[thrid] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ListAllDrives, (LPVOID)struc, 0, NULL);
            Sleep(500);
        }
        else if (driveType == DRIVE_REMOVABLE) {
 structura* struc = (structura*)HeapAlloc(GetProcessHeap(), NULL, sizeof(structura));
            struc->path = driveStrings;
            thr[thrid] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ListAllDrives, (LPVOID)struc, 0, NULL);
            Sleep(500);
C++
1
2
3
4
5
6
7
8
DWORD WINAPI ListAllDrives(LPVOID param)
{
    structura temp = (structura*)param;
    
    MessageBoxW(NULL, temp.path, NULL, SW_SHOW);
HeapFree(.... temp);
    return 0;
}
1
8 / 2 / 0
Регистрация: 28.11.2017
Сообщений: 157
21.02.2020, 13:55  [ТС]
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
В том, что structura* struc = (structura*)HeapAlloc надо делать перед каждым вызовом CreateThread, а в функции потока делать HeapFree
это все хорошо, но также проблема была в функции GetLogicalDriveStringsW(); из-за нее везде нестабильно работало... переписал под GetLogicalDrives(); и все без проблем!
0
628 / 392 / 135
Регистрация: 06.03.2017
Сообщений: 1,469
21.02.2020, 14:10
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
и никогда им не пользуйся
Можно узнать, чем он так плох?
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
21.02.2020, 14:14
Цитата Сообщение от Pilarentes Посмотреть сообщение
Можно узнать, чем он так плох?
Потому что при нормальном завершении процесса может выполняться какой-то код, например деструкторы статических объектов. А ExitProcess просто тупо гасит твой процесс, соответственно, ничего после него не выполняется.
1
46 / 114 / 11
Регистрация: 24.04.2019
Сообщений: 796
21.02.2020, 14:29
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
В том, что structura* struc = (structura*)HeapAlloc надо делать перед каждым вызовом CreateThread, а в функции потока делать HeapFree
Здесь я немного не понял. А почему нужно делать так?
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
21.02.2020, 14:33
Цитата Сообщение от Дмитрий_1982 Посмотреть сообщение
Здесь я немного не понял. А почему нужно делать так?
Потому что каждый поток должен здесь работать со своей копией объекта, которую никто другой не должен менять.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
21.02.2020, 14:33
Помогаю со студенческими работами здесь

Cpp. Как очищается память в функциях?
Я привык, что чисткой памяти занимается GC. А тут надо написать библиотеку на Cpp. От сюда базовые вопросы: Как себя ведет память в...

Беда с курсором. Видимо, не очищается память
Есть у меня такой курсор: set @prodName = (select Product_name from inserted) set @prodQuant = (select Quantity from inserted) ...

Не очищается память при завершении потока
Добрый день уважаемые форумчане. Из главного потока создаю поток который работает в цикле while not Terminated do. В этом цикле при...

Почему не очищается память после очистки List а?
Привет. Есть такой код: static void Main(string args) { Console.ReadKey(); Test(); ...

Очищается ли вся динамическая память по завершению программы?
#include&lt;stdio.h&gt; #include&lt;malloc.h&gt; #include&lt;string.h&gt; #include&lt;locale.h&gt; const int Max = 100; void main() { ...


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
Почему дизайн решает?
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 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru