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)) で中断すると、ダミーが空であることが予想されます。しかし、使用して印刷すると

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に「ダミー」の値を出力します。その値は同じままで、exprNameの値に変わりません。「exprName」を出力しましたが、間違いなく異なる値が含まれています!

これは不可解です!ダミーが exprName と同じ値に初期化されないのはなぜですか?

4

1 に答える 1

2

それはまさに初期化されていないことの意味です: 値は (一種の) 予測不可能であり、内容を見ると意味をなさない可能性があります。

あなたの場合、_M_ptrポインターがたまたま有効なメモリ範囲を指しているため、文字列のようなものが表示されます。内容は、この関数の前に呼び出された別の関数によって一時的にスタックに格納された値に依存します。

于 2012-11-07T00:17:04.420 に答える