gpt4 book ai didi

c++ - 为什么第二个字符串保存在第一个字符串中?

转载 作者:搜寻专家 更新时间:2023-10-31 00:57:11 25 4
gpt4 key购买 nike

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

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

当编译器执行第 1 行 S1 是 String1 时我有断点,但是当它执行第 2 行时 S1 将是 String2

我想知道为什么会这样?

最佳答案

_bstr_t1BSTR 的包装类。构造函数分配一个 BSTR(如果是拷贝,则递增引用计数),当引用计数器归零时,析构函数释放 BSTR

所以

const BSTR S1 = _bstr_t("String1");

做三件事:

  1. 创建一个临时的、未命名的 _bstr_t,其中包含一个指向内存中某处分配的“String1”的 BSTR
  2. BSTR 分配给 S1。这是指针的拷贝。没有分配或移动数据。
  3. 销毁临时 _bstr_t 因为它从未分配给任何东西,因此实际上具有一个操作的值(value)范围。

_bstr_t 引用计数为零,因此释放了 BSTR。这意味着 S1 指向的内存已被释放,可以重新用于第二行。使用 S1 将导致未定义的行为,因此在调试器中查看它可能会从下界召唤 C'thulu 来吞噬我们所有的灵魂。幸运的是,程序崩溃的可能性更大。

解决方案:

要么保留 _bstr_t

_bstr_t S1("String1");
// use S1

或者用困难的方式来做

const BSTR S1 = SysAllocString(L"String1");
// use S1
SysFreeString(S1);

第一个选项应该更安全。

_bstr_t documentation.

关于c++ - 为什么第二个字符串保存在第一个字符串中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37929394/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com