В чем разница между BSTR и _bstr_t? - PullRequest
19 голосов
/ 04 декабря 2008

Может кто-нибудь объяснить разницу между типами, упомянутыми выше, и пример использования, чтобы четко объяснить разницу между ними?

Любая помощь будет принята с благодарностью! Примечание: этот вопрос является ответвлением от этот другой вопрос

Ответы [ 3 ]

21 голосов
/ 05 декабря 2008

BSTR - это строковый тип данных, используемый с COM.

_bstr_t - это класс-оболочка, который работает как интеллектуальный указатель, поэтому он освобождает выделенную память, когда переменная уничтожается или выходит из области видимости. _bstr_t также имеет подсчет ссылок, который увеличивается каждый раз, когда вы передаете переменную _bstr_t по значению (избегая ненужного копирования) и уменьшается, когда она больше не используется. Всякий раз, когда все ссылки уничтожаются, выделенная память для строки освобождается.

Альтернативой BSTR является CComBSTR. Он также управляет памятью для BSTR, но не имеет подсчета ссылок.

13 голосов
/ 04 декабря 2008

BSTR - это необработанный указатель, а _bstr_t - это класс, инкапсулирующий этот указатель.

Это та же разница, что и char * против std :: string .

10 голосов
/ 04 декабря 2008

_bstr_t переносит тип BSTR. Итак, когда вы создаете экземпляр _bstr_t, вы также создаете BSTR. _bstr_t просто оборачивает все для вас и действует как «умный ptr» для BSTR.

BSTR

http://msdn.microsoft.com/en-us/library/ms221069.aspx

SysAllocString ()

http://msdn.microsoft.com/en-us/library/ms891285.aspx

_bstr_t

https://msdn.microsoft.com/en-us/library/zthfhkd6.aspx

...