Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Hunter13ua
46 / 46 / 5
Регистрация: 25.10.2011
Сообщений: 183
#1

Краш на моменте vector.push_back() - C++

02.07.2015, 15:53. Просмотров 272. Ответов 4

Доброго времени суток.
Начну с короткого объяснения кода: программа считывает файл строчка за строчкой ( в строке ровно 1 слово и 1 число, записанные через пробел ), создаёт объект с этими данными и записывает указатель на этот объект в вектор.
Немного исследований мною:
1) Во время отладки программы, она работает безошибочно и проходит по всем моментам.
2) При изменении поля имени с name.c_str() на "Default Name" или вовсе использования конструктора по умолчанию - краш не наблюдается. Однако краш происходит именно в момент push_back, а не создания объекта.
3) Краш происходит только с определёнными данными, хотя их формат верен. ( строки входного файла пометил ).
Если кто сталкивался с такой проблемой, прошу откликнуться. Или если есть ошибка в коде, прошу указать.
main.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <iostream>
#include <fstream>
#include <ctime>
#include <cstdlib>
#include <vector>
#include <Player.h>
using namespace std;
 
vector<Player*> getPlayersFromFile(const char* filename){
    ifstream file(filename);
    vector<Player*> players;
    string name; int elo;
    while (file >> name >> elo){
        Player* newPlayer = new Player(name.c_str(), elo);
        players.push_back(newPlayer);
    }   return players;
}
 
int main()
{
    srand(time(0));
    vector<Player*> players = getPlayersFromFile("Players.txt");
    for( vector<Player*>::iterator i = players.begin(); i != players.end(); i++ )
        cout << (*i)->getName() << ' ' << (*i)->getElo() << endl;
    return 0;
}

Player.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#ifndef PLAYER_H
#define PLAYER_H
 
class Player
{
    public:
        Player();
        Player(const char*,int);
        Player(const Player&) = delete;
        virtual ~Player();
        const char* getName();
        int getElo();
    protected:
    private:
        char *name;
        int elo;
};
 
#endif // PLAYER_H

Player.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include "Player.h"
#include <cstdlib>
#include <cstring>
#include <iostream>
 
Player::Player()
{
    name = NULL;
    elo = 1500;
}
 
Player::~Player()
{
    delete name;
}
 
Player::Player(const char *Name, int Elo)
{
    name = new char[strlen(Name)];
    strcpy(name, Name);
    elo = Elo;
}
 
const char* Player::getName()
{
    return name;
}
 
int Player::getElo()
{
    return elo;
}

Players.txt
Код
inhumanlol 1500
Leichenlager 1500
Hellzpawn 1500
Miithrandir 1500
Hunter13UA 1500
z3rglein 1500
Akml 1500
apzop 1500
Baphemot 1500 <--- crash
Crimsonsnake 1500
Drunkelion 1500
EggsTreme 1500
eksp0 1500
mohamd22 1500
Ownerr 1500 <--- crash
SwedishDuck 1500
ThTHrousThT 1500
Ultigod 1500 <--- crash
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.07.2015, 15:53     Краш на моменте vector.push_back()
Посмотрите здесь:

C++ Меняют ли элементы в vector свои адреса при вызове метода push_back?
C++ std::vector<T>.push_back(T) - Error
Вызов конструктора с несколькими параметрами при использовании push_back() в vector'е C++
C++ класс vector ошибка в push_back()
C++ Vector . push_back
C++ Метод push_back() класса vector
C++ push_back() and vector of classes
C++ Vector subscript out of range (push_back, a не [])
C++ Ошибка push_back() в vector
C++ vector выдает странные строки при использовании push_back
При использовании push_back для vector-а, все предыдущие элементы перезаписываются C++
Алгоритмическая сложность операции push_back в vector C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт CЭксперт С++
12891 / 7277 / 811
Регистрация: 27.09.2012
Сообщений: 17,976
Записей в блоге: 2
Завершенные тесты: 1
02.07.2015, 15:59     Краш на моменте vector.push_back() #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
C++
1
2
    name = new char[strlen(Name)];
    strcpy(name, Name);//Выход за пределы выделенной памяти. Как результат - хрен его знает что
Забыли про нулевой символ в конце строки.

C++
1
name = new char[strlen(Name)+1];
Добавлено через 2 минуты
И возникает вопрос, почему не использовать std::string?
Hunter13ua
46 / 46 / 5
Регистрация: 25.10.2011
Сообщений: 183
02.07.2015, 16:15  [ТС]     Краш на моменте vector.push_back() #3
Croessmah
И правда. Забыл, что strcpy копирует дополнительный символ. Благодарю.
Ответом является, возможно, неразумная экономия памяти
Croessmah
Модератор
Эксперт CЭксперт С++
12891 / 7277 / 811
Регистрация: 27.09.2012
Сообщений: 17,976
Записей в блоге: 2
Завершенные тесты: 1
02.07.2015, 16:40     Краш на моменте vector.push_back() #4
Цитата Сообщение от Hunter13ua Посмотреть сообщение
Ответом является, возможно, неразумная экономия памяти
Я б готовое решение использовал


C++
1
Player(const Player&) = delete;
Почему тогда не удалили operator=?
Hunter13ua
46 / 46 / 5
Регистрация: 25.10.2011
Сообщений: 183
02.07.2015, 16:47  [ТС]     Краш на моменте vector.push_back() #5
Croessmah
В main.cpp я vector и string использовал только временно, в конечном итоге обойдусь простым массивом, т.к. никаких операций над массивом или строками проводить не буду ( кроме вывода, естественно ).
До оператора присваивания ещё не дошел. Когда писал конструкторы - уже машинально написал три штуки. Привычка что ли. В конечном итоге, может, вовсе оставлю только один.
Yandex
Объявления
02.07.2015, 16:47     Краш на моменте vector.push_back()
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru