_bstr_t to char*,惊人的结果

Jan*_*Lee 4 bstr char

第一:

LPCTSTR asdfsdf = (LPCTSTR)(_bstr_t)v;
printf("%s\n", asdfsdf);
Run Code Online (Sandbox Code Playgroud)

第二:

printf("%s\n", (LPCTSTR)(_bstr_t)v);
Run Code Online (Sandbox Code Playgroud)

它们是相同的,但第一个条件导致无法读取的代码

为什么?

Gre*_*ill 6

所述_bstr_t封装一个C++类内部的BSTR.在你的第一个实例中:

LPCTSTR asdfsdf = (LPCTSTR)(_bstr_t)v;
Run Code Online (Sandbox Code Playgroud)

你正在创建一个_bstr_t对象,从中提取LPCTSTR出来,然后临时_bstr_t对象被破坏.无论asdfsdf指向什么现在已经解除分配,不能再使用了.

在你的第二个例子中

printf("%s\n", (LPCTSTR)(_bstr_t)v);
Run Code Online (Sandbox Code Playgroud)

临时_bstr_t对象不破坏,直到之后printf()叫,所以使用没有问题的LPCTSTR值.

  • `v` 是什么并不重要。问题在于`_bstr_t`临时对象在构造时从`v`创建了数据的*副本*,并在临时对象被破坏时释放该副本。 (2认同)