Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / AllocSysString / 5 сообщений из 5, страница 1 из 1
04.11.2004, 14:14
    #32768804
Alex_VC
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
AllocSysString
Есть такой метод класса CString AllocSysString , который делает копию строки в формате OLE (BSTR). В MSDN сказано, что для освобождения выделенных ресурсов необходимо вызвать ::SysFreeString.
А если я делаю так:
Код: plaintext
1.
2.
3.
4.
5.
{
 CString str;
  _variant_t v;
 v=(BSTR)str.AllocSysString(); 
 ...
}
надо ли вызывать функцию ::SysFreeString ? Деструктор _variant_t не выполняет эту функцию при выходе объекта из зоны видимости?
Будет ли утечка памяти ?
Какие у кого соображения ?
...
Рейтинг: 0 / 0
04.11.2004, 16:14
    #32769129
Siebente
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
AllocSysString
Хм... никогда не задумывался (а зря?)

Сделай примерчик, посмотри, будет там меморилик жить или нет :)
...
Рейтинг: 0 / 0
04.11.2004, 16:21
    #32769150
Ми
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
AllocSysString
В MSDN статья VARIANT Manipulation API Functions, там вот так сказано:
For VT_BSTR, there is only one owner for the string. All strings in variants must be allocated with the SysAllocString function. When releasing or changing the type of a variant with the VT_BSTR type, SysFreeString is called on the contained string.

Судя по этому замечанию, ::SysFreeString вызывать не надо, а достаточно написать v.Clear();
Но это только мои домыслы.... Если не так, прошу не пинать.
...
Рейтинг: 0 / 0
04.11.2004, 18:08
    #32769425
AllocSysString
автор
Код: plaintext
1.
2.
3.
4.
5.
6.
{
 CString str;
  _variant_t v;
 v=(BSTR)str.AllocSysString(); 
 ...
}

Как мне кажется если не изменяет память то ваше выражение (BSTR)str.AllocSysString() делает утечку памяти которую вы никак уже не освободите потому как в нем же теряете указатель на выделенную память вызывая AllocSysString(), делее в коде нет утечек _variant_t сама заботится об освобождении ресурса.
Решил проверить. Проверял на VS6.0SP5
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
inline _variant_t& _variant_t::operator=(const wchar_t* pSrc) throw(_com_error)
{
	// Clear the VARIANT (This will SysFreeString() any previous occupant)
	//
	Clear(); 

	V_VT(this) = VT_BSTR;

	if (pSrc == NULL) {
		V_BSTR(this) = NULL;
	}
	else {
		V_BSTR(this) = ::SysAllocString(pSrc); //ЗДЕСЬ ПОВТОРНО ВЫДЕЛЯЕТСЯ ПАМЯТЬ ПРИЧЕМ указатель ты теряешь на то что выделил вызовом str.AllocSysString()

		if (V_BSTR(this) == NULL) {
			_com_issue_error(E_OUTOFMEMORY);
		}
	}

	return *this;
}

По поводу вашего вопроса надо ли освобождать - ненадо
Код: plaintext
1.
2.
3.
inline _variant_t::~_variant_t() throw(_com_error)
{
	_com_util::CheckError(::VariantClear(this));
}

VariantClear
Clears a variant.

HRESULT VariantClear(
VARIANTARG * pvarg
);
Parameter
pvarg
Pointer to the VARIANTARG to clear.
Return Value
The return value obtained from the returned HRESULT is one of the following.

Value Meaning
S_OK Success.
DISP_E_ARRAYISLOCKED The variant contains an array that is locked.
DISP_E_BADVARTYPE The variant type pvarg is not a valid type of variant.
E_INVALIDARG One of the arguments is invalid.

Comments
Use this function to clear variables of type VARIANTARG (or VARIANT) before the memory containing the VARIANTARG is freed (as when a local variable goes out of scope).

The function clears a VARIANTARG by setting the vt field to VT_EMPTY. The current contents of the VARIANTARG are released first. If the vt field is VT_BSTR, the string is freed . If the vt field is VT_DISPATCH, the object is released. If the vt field has the VT_ARRAY bit set, the array is freed.
...
Рейтинг: 0 / 0
05.11.2004, 10:46
    #32770097
Alex_VC
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
AllocSysString
Да, внутрь _variant_t не догадался глянуть...
Похоже, что такую конструкцию нежелательно использовать, т.к. получается, что память выделяется дважды (str.AllocSysString и в _variant_t::operator= ), а освобождается - один раз - в деструкторе _variant_t . Хотя, c другой стороны, отладчик не выдает предупреждений об утечке памяти- короче понятно, что ничего не понятно...
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / AllocSysString / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]