C ++ строка превращается в указатель - PullRequest
0 голосов
/ 23 июля 2011

У меня есть функция со следующим объявлением:

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;

Проблема, с которой я сталкиваюсь, заключается в том, что независимо от того, что за строка «карточка», я ударил карточку не найденное утверждение. Согласно ГБД:

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

Так что в функции playCard () переменная карты по какой-то причине является указателем. Интересно, что оператор 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 вызывает segfault, когда я пытаюсь распечатать последний, но тот же код выполняется без ошибок segfaults.

У меня такое чувство, что я имею дело с некоторыми странными проблемами с памятью, связанными с наличием вектора, полного указателей на объекты, но я не могу понять, как это сделать.

Что здесь происходит?

1 Ответ

5 голосов
/ 23 июля 2011

Вы хотите break вместо continue внутри цикла.

Они похожи;continue означает продолжение следующей итерации цикла, break означает выход из цикла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...