【发布时间】:2012-12-06 07:52:16
【问题描述】:
第一:
LPCTSTR asdfsdf = (LPCTSTR)(_bstr_t)v;
printf("%s\n", asdfsdf);
秒:
printf("%s\n", (LPCTSTR)(_bstr_t)v);
它们是相同的,但第一个条件导致代码不可读
为什么?
【问题讨论】:
第一:
LPCTSTR asdfsdf = (LPCTSTR)(_bstr_t)v;
printf("%s\n", asdfsdf);
秒:
printf("%s\n", (LPCTSTR)(_bstr_t)v);
它们是相同的,但第一个条件导致代码不可读
为什么?
【问题讨论】:
_bstr_t class 将 BSTR 封装在 C++ 类中。在您的第一个实例中:
LPCTSTR asdfsdf = (LPCTSTR)(_bstr_t)v;
您正在创建一个_bstr_t 对象,从中提取LPCTSTR,但随后临时_bstr_t 对象被破坏。无论asdfsdf 指向什么,现在都已被释放,无法再使用。
在你的第二个例子中
printf("%s\n", (LPCTSTR)(_bstr_t)v);
临时的_bstr_t 对象直到之后 printf() 被调用后才会被破坏,所以使用LPCTSTR 值没有问题。
【讨论】:
v 是什么并不重要。问题是_bstr_t 临时对象在构造时会从v 创建数据的副本,并在临时对象被破坏时释放该副本。