Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 31.10.2012, 15:10   #1
RomanA
Пользователь
 
Регистрация: 10.08.2011
Сообщений: 30
По умолчанию GlobalAlloc, GlobalFree и EmptyClipboard несколько вопросов

Есть функция копирования в буфер:

Код:
CString str(“blablabla”);

HGLOBAL hString;

if(::OpenClipboard(NULL))
{
	::EmptyClipboard();
	hString = ::GlobalAlloc(GMEM_DDESHARE, sizeof(TCHAR) * (str.GetLength() + 1));
		if(!hString) return;

	LPVOID szString = ::GlobalLock (hString);
	if(szString)
	{
		memcpy (szString, (LPCTSTR)str, sizeof(TCHAR) * (str.GetLength() + 1));
		::GlobalUnlock (hString);	
            	::SetClipboardData(CF_TEXT, hString);
	}	
	::CloseClipboard();
}
Есть опасения, что в ней могут происходить утечки памяти, т. к. мне не вполне понятен механизм работы некоторых функций.

1) Во всех примерах, что я находил в интернете функция GlobalAlloc использовалась без GlobalFree. Если я правильно понимаю, использование GlobalFree не нужно, т. к. она неявно вызовется в EmptyClipboard()? Если ошибаюсь, то в чем?

2) При завершении приложения не произойдет ли утечка памяти, т. к. я читал, что SetClipboardData не копирует данные, а просто помечает блок памяти как общедоступный. Следовательно после завершения приложения он остается. Но когда мы заполним буфер из другого места (например скопируем что-нибудь из блокнота), не остается ли блок данных, бывший до этого в буфере бесхозным?

3) Как влияет флаг GMEM_DDESHARE на выделение памяти? Насколько я понимаю, именно благодаря ему система оставляет данные в памяти после завершения приложения. И если выставить любой другой флаг, то после завершения приложения данные будут уничтожены?

Также буду очень признателен, если дадите ссылку на хорошую книжку по этой теме.
RomanA вне форума Ответить с цитированием
Старый 31.10.2012, 16:56   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

1) Все правильно, если вы успешно вставили данные и закрыли буфер обмена, тогда память уже не ваша

2) Кога закрывается приложение освобождаются *все* его ресурсы. То, что лежит в буфере обмена можно считать безхозным, но следущий, кто положит туда данные уничтожит старые.
waleri вне форума Ответить с цитированием
Старый 01.11.2012, 12:53   #3
RomanA
Пользователь
 
Регистрация: 10.08.2011
Сообщений: 30
По умолчанию

Спасибо за ответы, теперь спокоен
RomanA вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Несколько вопросов Rost93 PHP 18 19.09.2012 19:38
Несколько вопросов по C++ Antitime Общие вопросы C/C++ 10 26.01.2012 15:00
несколько вопросов spydark91 Общие вопросы Delphi 2 18.07.2011 13:48
Несколько вопросов pix_l Общие вопросы Delphi 1 29.03.2009 22:26
Несколько Вопросов Дорст Общие вопросы Delphi 3 12.11.2007 09:18