2013-05-20 3 views
1

У меня есть класс, который содержит вектор указателей на класс. В большинстве своих функций-членов я могу получить доступ и изменить вектор просто отлично. Однако в одной функции даже вызов .size() или получение итератора вызывает segfault в моей программе.Вектор указателей segfault при вызове size() и при создании итератора

Вот класс с вектором указателей на класс:

class floor 
{ 
public: 
    floor(string imageFile, string a_walkwayFile, string waypointFile, int a_id, sf::Vector2i a_pos); 
    ~floor(); 

    int getId() { return id; }; 
    void update(sf::RenderWindow* App); 
    sf::Sprite* getSprite() { return sprite; }; 
    vector<int> parseCSVLine(string line); 
    void loadWalkways(); 
    void convertToView(sf::RenderWindow* App, sf::View* view); 
    bool pointInWalkway(sf::Vector2f pt); 

private: 
    vector<sf::RectangleShape*> walkWays; 
    sf::Sprite* sprite; 
    int id; 
    float scale; 
    string walkwayFile; 
}; 

Здесь объекты добавляются к вектору сниппет Whee:

walkWays.push_back(new sf::RectangleShape()); 
walkWays[walkWays.size() - 1]->setPosition(sf::Vector2f(parsedLine[0], parsedLine[1])); 
walkWays[walkWays.size() - 1]->setSize(sf::Vector2f(parsedLine[2] - parsedLine[0], parsedLine[3] - parsedLine[1])); 
walkWays[walkWays.size() - 1]->setFillColor(sf::Color(0,0,255,25)); 
walkWays[walkWays.size() - 1]->setOutlineColor(sf::Color::Blue); 
walkWays[walkWays.size() - 1]->setOutlineThickness(3); 

Вот фрагмент кода, который всегда получает доступ к вектору только хорошо:

void floor::update(sf::RenderWindow* App) 
{ 
    App->draw(*sprite); 

    for(int i = 0; i < walkWays.size(); ++i) 
    App->draw(*walkWays[i]); 
} 

Теперь вот функция, в которой каждый звонок или ссылка ENCE результатам функции в Segfault:

bool floor::pointInWalkway(sf::Vector2f pt) 
{ 
    cout << walkWays.size() << endl; // this segfaults 

    if(walkWays.size() != 0) // this segfaults 
    for(vector<sf::RectangleShape*>::iterator it = walkWays.begin(); it != walkWays.end(); ++it) // this segfaults too! 
     if((*it)->getGlobalBounds().contains(pt.x, pt.y)) 
     return true; 
    return false; 
} 

Любые указатели о том, как я бы исправить это было бы весьма признателен!

+0

Вы пробовали использовать gdb? или какой-либо отладчик в программе? –

+0

Я использовал код: блокирует отладчик, поэтому я знаю, где он сбой. Кроме того, неисправная функция называется ПОСЛЕ того, что все объекты добавляются к вектору, если это помогает. – lfnunley

+0

вы могли бы разместить весь свой код, чтобы, возможно, вставить bin? по крайней мере, относящийся к объекту, я не могу найти проблему с вашим текущим кодом. –

ответ

0

Вашего цикл файл читает один много раз, попробуйте использовать цикл с этой структурой:

string line; 
    getline(file, line);  
    while(file) 
    { 
      if(parsedLine.size() == 4) 
      { 
      walkWays.push_back(new sf::RectangleShape()); 
      walkWays[walkWays.size() - 1]->setPosition(sf::Vector2f(parsedLine[0], parsedLine[1])); 
      walkWays[walkWays.size() - 1]->setSize(sf::Vector2f(parsedLine[2] - parsedLine[0], parsedLine[3] - parsedLine[1])); 
      walkWays[walkWays.size() - 1]->setFillColor(sf::Color(0,0,255,25)); 
      walkWays[walkWays.size() - 1]->setOutlineColor(sf::Color::Blue); 
      walkWays[walkWays.size() - 1]->setOutlineThickness(3); 
      /*sf::RectangleShape* rect = new sf::RectangleShape(); 
      rect->setPosition(sf::Vector2f(parsedLine[0], parsedLine[1])); 
      rect->setSize(sf::Vector2f((float)parsedLine[2] - parsedLine[0], (float)parsedLine[3] - parsedLine[1])); 
      rect->setFillColor(sf::Color(0,0,0,0)); 
      //rect->setOrigin(sf::Vector2f(parsedLine[0], parsedLine[2])); 
      //cout << parsedLine[0] << ", " << parsedLine[1] << endl; 
      rect->setOutlineColor(sf::Color::Blue); 
      rect->setOutlineThickness(3); 
      walkWays.push_back(rect);*/ 
      } 
      getline(file, line); 
    } 

это предотвращает файл от чтения одного до много раз и будет правильно остановить.

+0

Благодарим вас за советы. Я последовал за этим, но, к сожалению, это не исправить мою проблему. – lfnunley

+0

Хорошо, где вы называете эту функцию? –

+0

Это вызывается перед рисованием окна и перед функцией обновления – lfnunley

Смежные вопросы