【问题标题】:C++ string turning into a pointerC++字符串变成指针
【发布时间】:2011-07-23 00:16:43
【问题描述】:

我有一个具有以下声明的函数:

void playCard(string card);

以及以下实现:

void Player::playCard(string card)
{
    cout << "Playing " << card << "!" << endl;

    // Find iterator representing the card to be played
    vector<Card*>::iterator iter;
    for(iter = hand.begin(); iter != hand.end(); iter++)
    {
        if( (*iter)->getName() == card)
            continue;
    }

    // ERROR - Card not found in hand
    if(iter == hand.end())
        assert(false);

    // more stuff
}

从以下代码块调用该函数:

// Divide string into 2 words
istringstream iss(in, istringstream::in);
string command, target;
iss >> command >> target;

if(command == "play")
{
    players.at(currentTurn)->playCard(target);
}

玩家被声明为:

vector<Player*> players;

我遇到的问题是,无论“card”字符串是什么,我都会遇到 card not found 断言。根据gdb:

Breakpoint 1, Player::playCard (this=0xb3a010, card=0x28ca00) at Player.cpp:138
138         cout << "Playing " << card << "!" << endl;
(gdb) print card
$1 = (string *) 0x28ca00

所以在 playCard() 函数中,card 变量出于某种原因是一个指针。有趣的是,cout 语句仍然正确显示字符串的内容。在调用 playCard() 之前,根据 gdb,该变量不是指针,只是一个普通字符串。

另外,这很有趣:

(gdb) print iter
$1 = {_M_current = 0xb9a328}
(gdb) print iter->getName()
Couldn't find method __normal_iterator<Card**,std::vector<Card*, std::allocator<Card*> > >::getName
(gdb) print *iter
$2 = (class Card *&) @0xb9a328: 0xb9a160
(gdb) print *iter->getName()
Couldn't find method __normal_iterator<Card**,std::vector<Card*, std::allocator<Card*> > >::getName
(gdb) print (*iter)->getName()

Program received signal SIGSEGV, Segmentation fault.
0x61111178 in memcpy () from /usr/bin/cygwin1.dll

所以当我尝试打印最后一个时,gdb 会导致段错误,但相同的代码执行时没有任何段错误。

我感觉我正在处理一些奇怪的内存问题,这些问题与充满指向对象的向量有关,但我不能完全解决它。

这是怎么回事?

【问题讨论】:

  • 你确定手中的Cards没有一个被删除?
  • 我实际上还没有达到删除任何卡片的程度。即使是这种情况,也可以解释 gdb 段错误,但不能解释代码在没有 gdb 的情况下运行没有段错误以及字符串显示为指针的事实。
  • 好吧,不幸的是,发布的代码并没有真正提供太多内容。程序的输出是什么?预期的输出是多少?

标签: c++ pointers stl


【解决方案1】:

您希望在循环中使用break 而不是continue

它们有点相似; continue 表示继续循环的下一次迭代,break 表示跳出循环。

【讨论】:

  • 哇。我不敢相信我错过了。现在可以了。我觉得很愚蠢:)
  • @numegil,不要觉得自己很笨——这些东西都是有经验的。现在你有经验了。
  • 我仍然很好奇为什么字符串显示为指针...有什么想法吗?
  • @numegil,这也是个谜。也许是编译器优化决定用引用替换副本?似乎不太可能。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-22
  • 1970-01-01
  • 2011-04-12
  • 1970-01-01
  • 2021-06-28
  • 2023-03-15
  • 1970-01-01
相关资源
最近更新 更多