UnicodeString::Length() 干扰调试器显示

UnicodeString::Length() interferes with debugger display

只要当前函数包含 UnicodeString::Length() 调用,调试器似乎就会禁止查看局部变量中 UnicodeString 的内容并监视 windows。

运行 C++ Builder 10.3 Rio Enterprise(已升级到 10.31 以尝试解决问题)我在其中启动了一个新项目,添加了一个按钮并为该按钮放入了以下代码。这是一大段代码的精简版,用于追踪和重现问题。

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    TFDQuery* qry = new TFDQuery(NULL);

    UnicodeString search = "SELECT *\rFROM Client\rWHERE id>0;";
    UnicodeString currLine;
    int to, len;

    qry->SQL->Clear();

    to = search.Pos("\r");
    while (to > 0) {
        currLine = search.SubString(1, to-1);

        qry->SQL->Add(currLine);

        //len = search.Length()-1;  // Offending line
        search = search.SubString(to+1, 999999);
        to = search.Pos("\r");
    }
    currLine = search;

    qry->SQL->Add(currLine);
}

下图显示了这段代码的两次不同运行。一个完全如上所示(注释掉了一行)。另一个显示包含该行。

我担心调试器只显示名为 "search" 的变量的表观地址,如果我展开它,它会显示“????”,而不是变量的内容,如箭头。另请注意,断点位于导致调试器切换视图的行上方。如果我实际计算子字符串的长度(而不是将“999999”作为其长度),我如何才能让 "search" 的内容出现?

经过一些试验后,我现在可以使用可能的解决方法部分地回答我自己的问题。将 "search.Length()" 替换为 "wcslen(search.c_str())" 似乎可行,至少它没有在监视列表和局部变量 windows 中仅显示 UnicodeStrings 地址的副作用。在这一点上,我还没有彻底测试这是否最终会引发其他问题。但是为什么我必须为这种语言的基本类型这样做呢?