我有一个c ++应用程序,它将启动我的c#应用程序,并在一个方法中,我有下面的字符串
const BSTR S1 = _bstr_t("String1");
const BSTR S2 = _bstr_t("String2");
编译器执行line1 S1是String1 时有断点,但是当它执行line2 时,S1将是String2
我想知道为什么会这样?
答案 0 :(得分:4)
_bstr_t1
是BSTR
的包装类。构造函数分配BSTR
(或者如果副本增加引用计数),并且析构函数在引用计数器达到零时释放BSTR
。
所以
const BSTR S1 = _bstr_t("String1");
有三件事:
_bstr_t
,其中包含BSTR
,指向" String1"在内存中的某处分配。BSTR
分配给S1
。这是指针的副本。没有分配或移动数据。_bstr_t
,因为它永远不会分配给任何东西,因此实际上只有一个操作范围。 _bstr_t
引用计数为零,因此BSTR
被释放。这意味着内存S1
点已被释放,可以重用于第二行。使用S1
将导致未定义的行为,因此,只要在调试器中查看它就可以从幽冥领域召唤C&C thulu来消耗我们所有的灵魂。幸运的是程序崩溃的可能性更大。
解决方案:
保持_bstr_t
周围的<{p}}
_bstr_t S1("String1");
// use S1
或者以艰难的方式去做
const BSTR S1 = SysAllocString(L"String1");
// use S1
SysFreeString(S1);
第一个选项应该更安全。