Карта C ++ exc_bad_access (только для Apple) - PullRequest
0 голосов
/ 05 января 2012

Код

Читает с

В Windows 7 и 8 работает нормально. Однако при запуске в XCode 4 я получаю EXC_BAD_ACCESS на второй итерации, когда кто-то загружает карту (выберите «Загрузить карту» из заголовка).

Вы можете загрузить исходный код с проектом XCode

#include <string>
#include <map>
#include <iostream>

std::map <std::string, std::string> info;    

std::string* get_key_val( std::string* line )
{
    std::string key_val[2];
    int start, end;

    start = line->find_first_not_of( " " );
    end = line->find_last_of( ":" );
    if( start == -1 )
    {
        return NULL;
    }
    else if( end == -1 )
    {
        return NULL;
    }
    else
    {
        key_val[0] = line->substr( start, end - start );
    }

    start = line->find_first_not_of(" ", end + 1);
    end = line->find_last_of( " \n\r" );
    if( start == -1 )
    {
        return NULL;
    }
    else if( end == -1 )
    {
        return NULL;
    }
    else
    {
        key_val[1] = line->substr( start, end - start );
    }

    return key_val;
}


void parse_from_line( std::string* line )
{
    std::string* keyv = get_key_val( line );
    if( keyv[0].empty() == false && keyv[1].empty() == false ) info[ keyv[0] ] = keyv[1];
}

int main( int argc, char* args[] )
{
    std::string line = "name: Foo";
    parse_from_line( &line );
    std::cout << "Hello " << info["name"].c_str();
}

Ответы [ 2 ]

2 голосов
/ 05 января 2012

Ваша get_key_val функция начинается следующим образом:

std::string* Map::get_key_val( std::string* line )
{
  std::string key_val[2];

Она заканчивается следующим образом:

  return key_val;
}

Вы возвращаете указатель на переменную стека.Переменная key_val перестает существовать после возврата из функции, поэтому у вас есть неверный указатель, и два строковых значения в массиве уничтожаются.Последующее поведение не определено.

0 голосов
/ 12 марта 2015

С семантикой перемещения в C ++ 11 и далее, это менее необходимо для этого.Вы можете просто вернуть std :: string, и оператор перемещения должен избегать ненужных копий.

...