构造函数的使用术语是什么
What is the terminology for this use of a constructor?
一位同事编写了以下代码,我确信这是错误的。
我想向他解释这些问题,但不知道合适的术语,所以我找不到支持我立场的参考资料:
他的代码:
BSTR someString = _bstr_t(L"Hello World");
为什么我认为这是错误的:
我相信_bstr_t(L"Hello World");
调用_bstr_t
的构造函数,并创建该类型的短期临时变量。在这行代码之后(在分号序列点之后(,该临时文件将被自动删除,并释放其字符串空间
这将使someString
指向已释放的内存。
问题:
构造函数调用的正确术语是什么?
你能指出一些详细描述使用的参考文献/术语/页面吗?
临时_bstr_t
对象有术语吗
我想我会称之为"匿名的临时变量",但我不知道这在技术上是否准确。
(或者我的分析完全错误……如果是这样,我很想知道(
澄清:
_bstr_t是一个C++类,通常被微软用来包装他们的bstr类型,因此它有构造函数/析构函数/运算符等。
BSTR
只是WCHAR*
的typedef,所以它没有任何逻辑。这只是一个愚蠢的指针。
你说得对。
BSTR
是wchar_t *
的typedef,而CComBSTR/_bstr_t
具有到wchar_t *
的非常数转换运算符。
因此,临时_bstr_t
被分配,指向其开始的指针通过转换运算符被分配给someString
,并且对象在超出范围时被释放。然后你会得到一个悬空的指针。
你可以使用
_bstr_t someString ("Hello World");
或者甚至_bstr_t someString = "Hello, World";
。
有问题的代码
BSTR someString = _bstr_t(L"Hello World");
正在执行转换构造函数调用,该调用使用传递的wchar_t[]
创建一个bstr_t
实例。这本身就很好。例如,如果你想调用一个接受BSTR
的函数,并在其中传递一个字符串文字,你可以很容易地做到这一点:
someFunction( _bstr_t(L"Hello World") ); // OKAY
这是可以的,因为临时将一直存在,直到整个语句结束,该语句结束于分号所在的位置(这就是C++临时的工作方式(。
然而,有问题的代码是不好的,因为_bstr_t
实例随后被用来实例化一个BSTR
实例(使用类bstr_t
中的转换运算符(,该实例的寿命比临时实例长(临时实例在分号处被破坏,BSTR
指针someString
的寿命远远超过该值(。因此,您得到了一个悬空的BSTR
指针someString
,使用它会导致未定义的行为。如果OLE堆选择将用于字符串的内存映射到进程地址空间中,它甚至可能看起来是有效的。
class _bstr_t
随实现(Windows SDK中的文件comutil.h(一起提供,因此您可以使用调试器进入代码,并查看在创建临时时有一个SysAllocString()
调用,在销毁时有一次SysFreeString()
调用,后者在代码进入下一行之前发生。因此,OLE堆中的字符串对象在代码进入下一行之前被释放,并且someString
指针在所讨论的代码之后立即挂起。我想这足以说服最怀疑的人。
所以,是的,你是对的,代码是错误的。正确的代码是:
_bstr_t someString(L"Hello World");
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- C++避免重复声明的语法是什么
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- C++从另一个类访问公共静态向量的正确方法是什么
- "throw expression code" 1e7 >返回 d 是什么?投掷标准::overflow_error( "too big" ) : d;意味 着?
- 我称之为接口的正确编程术语是什么
- 仅用于内部目的的类的所有变量/成员的技术术语是什么
- 你用##来称呼宏或术语是什么
- 术语"attribute"在解析器的上下文中是什么意思?
- 用于将 void 指针强制转换为指向类型的指针的操作的术语是什么
- 具有不同参数的继承类构造函数的术语是什么
- 返回某些内容作为 out 参数的正确术语是什么?
- 术语"exception strong"和"exception neutral"是什么意思?
- 将本地人和临时人员存储在C++中的存储术语是什么?
- 构造函数的使用术语是什么
- ->、->* 和 .* 运算符的正确术语是什么?
- c++中非函数指针的恰当术语是什么?
- 在[expr.static.cast]/4中,术语"一个可行函数"指的是什么
- DWORD、LPTSR、LPBYTE、HANDLE这些术语是什么意思