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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 16, средняя оценка - 4.69
Meferov
0 / 0 / 0
Регистрация: 24.08.2012
Сообщений: 11
#1

Освобождение памяти - C++

24.08.2012, 19:17. Просмотров 2069. Ответов 20
Метки нет (Все метки)

Есть многопоточное приложение.
Создается глобальная структура:
Пример из msdn.
Код
typedef struct _MyData {
	int val1;
	TStringList* strlist;
} MYDATA, *PMYDATA;
Тут мы создаем помимо простых членов структуры - указатель на TStringList.

В функции, где собственно создаем сам поток, выделяем память, а указатель из структуры и будет указателем на эту выделяемую память.
Переменная типа структуры:
Код
PMYDATA pData;
Выделение памяти
Код
pData = (PMYDATA) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(MYDATA));
Код
pData->strlist = new TStringList;
pData->strlist->Text = Memo1->Text; //просто присваиваем данные
И создание потока, где pData передается как входящие данные.
Использовать WaitForMultipleObject не хочу.

Если в потоке вызвать
HeapFree(GetProcessHeap(), 0, pData);
Память освободим?
Как правильнее освободить память?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.08.2012, 19:17     Освобождение памяти
Посмотрите здесь:

Освобождение памяти - C++
Есть класс, в котором я выделяю память с помощью new. В деструкторе класса я с помощью delete освобождаю память, но у меня вылетает ошибка...

Проясните освобождение памяти - C++
Допустим есть такой код: typedef struct COORDINATE { QVector<int> x; QVector<int> y; QVector<int> z; } Coordinate; ...

Выделение-освобождение памяти - C++
Добрый день. Написал заготовку под программу. Возник вопрос: правильно ли выделяю-освобождаю память? Программа работает корректно, но...

Выделение и освобождение памяти - C++
Доброго времени суток. Пишу класс по ООП, и назрел один вопрос, связанный с моментом выделения и освобождения памяти. class SOK { ...

Правильное освобождение памяти - C++
Есть код class Test { public: int **container; int counter = 0; Test(unsigned int size) { container = new int*;

Освобождение и выделение памяти - C++
Помогите разобраться с программой, где здесь выделение памяти (как я понял это new) и где освобождение памяти. #include <iostream> ...

Освобождение памяти в деструкторе - C++
Здравствуйте у меня есть три класса: class Date { int iDay, iMonth, iYear; public: Date(); Date(Date&); Date(int Day,...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Meferov
0 / 0 / 0
Регистрация: 24.08.2012
Сообщений: 11
27.08.2012, 23:17  [ТС]     Освобождение памяти #16
Цитата Сообщение от Avazart Посмотреть сообщение
А как без него ?
Т.е. вы хотите завершить основной поток раньше вторичных и убив формы ?
Нет.
Еще один вопрос на счет потоков.
Использую Rad studio 2010. Создание потоков организовано через CreateThread(...);
Вывод информации на главную форму через критическии секции.
Слышал на счет проблемы "EInvalidOperation: Canvas does not aloow drawing". При использовании крит. секций в билдере такие ошибки возможны?
Что лучше использовать: крит. секции или Synchronize()?
Avazart
Эксперт С++
7122 / 5299 / 273
Регистрация: 10.12.2010
Сообщений: 23,450
Записей в блоге: 17
27.08.2012, 23:22     Освобождение памяти #17
Нет.
А как тогда ?

Synchronize() - это метод класса TThread, и к CreateThread(...) неимеет никакого отношения;

Слышал на счет проблемы "EInvalidOperation: Canvas does not aloow drawing". При использовании крит. секций в билдере такие ошибки возможны?
С Canvas еще не работал, но знаю что у неё есть свои методы обеспечивающие блокировку канвы.
Meferov
0 / 0 / 0
Регистрация: 24.08.2012
Сообщений: 11
27.08.2012, 23:31  [ТС]     Освобождение памяти #18
Цитата Сообщение от Avazart Посмотреть сообщение
С Canvas еще не работал, но знаю что у неё есть свои методы обеспечивающие блокировку канвы.
Сама канва в коде вообще не присутствует.
При прогоне большого количества потоков, иногда появляется такая ошибка в окне отладчика.


Цитата Сообщение от Avazart Посмотреть сообщение
А как тогда ?
Synchronize() - это метод класса TThread, и к CreateThread(...) неимеет никакого отношения;
Если использовать WaitForMultipleObject, как его использовать так, чтоб не повесить форму?
В цикле с небольшим delay?
Avazart
Эксперт С++
7122 / 5299 / 273
Регистрация: 10.12.2010
Сообщений: 23,450
Записей в блоге: 17
27.08.2012, 23:36     Освобождение памяти #19
Ну если у тебя приложение с формами тогда тебе не нужен WaitForMultipleObject().

И если нужно что-то выводить из потоков в компоненты на форме то лучше использовать класс TThread вместо WinApi - потока

Тебе нужно знать когда потоки завершаться ?
Meferov
0 / 0 / 0
Регистрация: 24.08.2012
Сообщений: 11
27.08.2012, 23:57  [ТС]     Освобождение памяти #20
Цитата Сообщение от Avazart Посмотреть сообщение
Тебе нужно знать когда потоки завершаться ?
Да. Подскажешь?
Событие OnTerminate?

Цитата Сообщение от Avazart Посмотреть сообщение
класс TThread
File | New | Other | Thread Object подключаем, создаем указатель и работаем. Bесь код потока засовываем в TThread::Execute(). Вывод на форму через Synchronize(func);, где func - ф-ция в которой код работы с формой.
Ведь так?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.08.2012, 00:00     Освобождение памяти
Еще ссылки по теме:

Освобождение динамической памяти в vs - C++
Вообщем попался я тут, и так, код: //#define _CRT_SECURE_NO_WARNINGS добавить в vs #include <iostream> #include <stdlib.h> ...

Освобождение участка памяти - C++
Добрый вечер. Подскажите, пожалуйста, где здесь ошибка. В разделе "После освобождения памяти" программа ничего не выдает. #include...

Освобождение памяти в классах - C++
Программа работает правильно но при завершении выдает ошибку! Ошибка на деструкторе! Пожалуйста объясните почему! Спасибо! #ifndef...

Освобождение памяти и указатели - C++
int **Matrix1 = new int*; // Создаем 1-ю матрицу for (int i(0); i < N1; i++) Matrix1 = new int; Подскажите пожалуйста, как...

Освобождение памяти delete - C++
Если у меня есть указатель (pt) N-ой степени, я присвоил ему указатель на начало массива (N - 1)ой степени (через new), затем некоторому...


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

Или воспользуйтесь поиском по форуму:
Avazart
Эксперт С++
7122 / 5299 / 273
Регистрация: 10.12.2010
Сообщений: 23,450
Записей в блоге: 17
28.08.2012, 00:00     Освобождение памяти #21
Проверяй MyThread1->Finished

Добавлено через 48 секунд
Цитата Сообщение от Meferov Посмотреть сообщение
File | New | Other | Thread Object подключаем, создаем указатель и работаем. Bесь код потока засовываем в TThread::Execute(). Вывод на форму через Synchronize(func);, где func - ф-ция в которой код работы с формой.
Ведь так?
Ну да...
Yandex
Объявления
28.08.2012, 00:00     Освобождение памяти
Ответ Создать тему
Опции темы

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