我有一个C ++应用程序,它将启动我的C#应用程序,并且在一种方法中,我具有以下字符串
const BSTR S1 = _bstr_t("String1");
const BSTR S2 = _bstr_t("String2");
我有当编译器执行一号线断点S1是String1中,但何时会执行2号线S1将字符串2
我想知道为什么会这样吗?
_bstr_t1
是的包装器类BSTR
。构造函数分配一个BSTR
(如果有副本,则增加引用计数),而析构函数BSTR
在引用计数器达到零时释放。
所以
const BSTR S1 = _bstr_t("String1");
做三件事:
_bstr_t
包含BSTR
指向内存中某处分配的“ String1”的名称。BSTR
给S1
。这是指针的副本。没有分配或移动数据。_bstr_t
因为它从未分配给任何事物,因此有效地具有一个操作的作用范围。该_bstr_t
引用计数降为零,因此BSTR
被释放。这意味着S1
at处的存储点已被释放,可以重新用于第二行。使用S1
将导致不确定的行为,因此,就像在调试器中查看该行为一样,它可能会从其他领域召唤C'thulu来消耗我们所有的灵魂。幸运的是,程序崩溃的可能性更大。
解决方案:
要么保持_bstr_t
s
_bstr_t S1("String1");
// use S1
还是很难做到
const BSTR S1 = SysAllocString(L"String1");
// use S1
SysFreeString(S1);
第一种选择应该是更安全。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句