|
|
|
AllocSysString
|
|||
|---|---|---|---|
|
#18+
Есть такой метод класса CString AllocSysString , который делает копию строки в формате OLE (BSTR). В MSDN сказано, что для освобождения выделенных ресурсов необходимо вызвать ::SysFreeString. А если я делаю так: Код: plaintext 1. 2. 3. 4. 5. Будет ли утечка памяти ? Какие у кого соображения ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.11.2004, 14:14 |
|
||
|
AllocSysString
|
|||
|---|---|---|---|
|
#18+
Хм... никогда не задумывался (а зря?) Сделай примерчик, посмотри, будет там меморилик жить или нет :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.11.2004, 16:14 |
|
||
|
AllocSysString
|
|||
|---|---|---|---|
|
#18+
В 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(); Но это только мои домыслы.... Если не так, прошу не пинать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.11.2004, 16:21 |
|
||
|
AllocSysString
|
|||
|---|---|---|---|
|
#18+
автор Код: plaintext 1. 2. 3. 4. 5. 6. Как мне кажется если не изменяет память то ваше выражение (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. По поводу вашего вопроса надо ли освобождать - ненадо Код: plaintext 1. 2. 3. 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.11.2004, 18:08 |
|
||
|
AllocSysString
|
|||
|---|---|---|---|
|
#18+
Да, внутрь _variant_t не догадался глянуть... Похоже, что такую конструкцию нежелательно использовать, т.к. получается, что память выделяется дважды (str.AllocSysString и в _variant_t::operator= ), а освобождается - один раз - в деструкторе _variant_t . Хотя, c другой стороны, отладчик не выдает предупреждений об утечке памяти- короче понятно, что ничего не понятно... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2004, 10:46 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=32769150&tid=2034148]: |
0ms |
get settings: |
6ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
41ms |
get topic data: |
6ms |
get forum data: |
2ms |
get page messages: |
27ms |
get tp. blocked users: |
1ms |
| others: | 197ms |
| total: | 294ms |

| 0 / 0 |
