1

我有以下一段代码。

#include <string>
#include <ctype.h>

std::string lowerCase(const std::string &exprName)
{
    std::string dummy(exprName);
    char firstChar = tolower(exprName.at(0));
    dummy.replace(0, 1, &firstChar);
    return dummy;
}

当我使用 GDB 单步执行代码并在第 6 行中断时 (std::string dummy(exprName)),我希望 dummy 为空。但是当我使用打印它时

p dummy

GDB 以下列方式打印变量的值

Breakpoint 1, lowerCase (exprName=...) at Utility.cpp:49
49      std::string dummy("");

(gdb) print dummy
$1 = {
  static npos = 18446744073709551615, 
  _M_dataplus = {
    <std::allocator<char>> = {
      <__gnu_cxx::new_allocator<char>> = {<No data fields>}, <No data fields>}, 
    members of std::basic_string<char, std::char_traits<char>, std::allocator<char> >::_Alloc_hider: 
    _M_p = 0x634261 "Expr * input2 = facade->derefE(facade->varE(v));\nNode * subject = f->"
  }
}

另外,如果我进入下一行代码,即

char firstChar = tolower(exprName.at(0));

我在 GDB 中打印“dummy”的值,它的值保持不变并且不会更改为 exprName 的值。我打印了“exprName”,它肯定包含不同的值!

这很莫名其妙!为什么 dummy 不会被初始化为与 exprName 相同的值?

4

1 回答 1

2

这正是uninitialized的含义:该值(某种程度上)是不可预测的,当您查看内容时,它可能没有意义。

在您的情况下,_M_ptr指针意外地指向有效的内存范围,因此您确实看到了一些看起来像字符串的东西。内容取决于另一个函数临时存储在堆栈中的值,该函数在此之前调用。

于 2012-11-07T00:17:04.420 回答