为什么第二个字符串会保存在第一个

时间:2016-06-20 18:29:43

标签: c++

我有一个c ++应用程序,它将启动我的c#应用程序,并在一个方法中,我有下面的字符串

const BSTR S1 = _bstr_t("String1");
const BSTR S2 = _bstr_t("String2");

编译器执行line1 S1是String1 时有断点,但是当它执行line2 时,S1将是String2

我想知道为什么会这样?

1 个答案:

答案 0 :(得分:4)

_bstr_t1BSTR的包装类。构造函数分配BSTR(或者如果副本增加引用计数),并且析构函数在引用计数器达到零时释放BSTR

所以

const BSTR S1 = _bstr_t("String1");

有三件事:

  1. 创建一个临时的,未命名的_bstr_t,其中包含BSTR,指向" String1"在内存中的某处分配。
  2. BSTR分配给S1。这是指针的副本。没有分配或移动数据。
  3. 会破坏临时_bstr_t,因为它永远不会分配给任何东西,因此实际上只有一个操作范围。
  4. _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);
    

    第一个选项应该更安全。

    _bstr_t documentation.