STD с индексом Arry (не итератор) дает ошибку сегментации - PullRequest
0 голосов
/ 28 февраля 2012

Я определил такой вектор в заголовочном файле

class entry
{
   public: 
     int key;
     int next;
};
std::vector<entry *> TB;

в файле cpp я написал:

int s1, val;
s1 = 10; val = 2;
gh = (TB.size() % s1);

Однако, когда я хочу что-то записать, я получаю ошибку сегментации

TB[gh]->key = val;   

В чем проблема с заданием?

Ответы [ 2 ]

2 голосов
/ 28 февраля 2012

Вектор не имеет элементов.Используйте push_back() или insert(), чтобы добавить элементы в вектор:

entry* e = new entry();
e->key   = val;
e->next  = 0;

TB.push_back(e);          // Append to vector.
TB.insert(TB.begin(), e); // Insert at beginning of the vector.

При уничтожении вектора TB вы должны выполнить итерации по элементам иdelete каждый в отдельности (или используйте умный указатель в качестве типа элемента, например boost::shared_ptr<entry> или std::unique_ptr<entry>).

Вы можете предоставить конструктор (ы) для entry, чтобы добавитьentry до TB более кратко:

class entry
{
public: 
    entry(int a_key, int a_next = 0) : key(a_key), next(a_next) {}
    int key;
    int next;
};

TB.push_back(new entry(val));
TB.insert(TB.begin(), new entry(val));
1 голос
/ 28 февраля 2012
  1. Вектор TB пуст, пока вы не заполните его некоторыми указателями.Например, TB.resize(100);.

  2. Точки в TB должны указывать на действительные адреса, то есть на некоторые действительные entry экземпляры.Например, TB[0] = new entry();.

Итак:

std::vector<entry *> TB(1);
TB[0] = new entry();
TB[0]->key = 42;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...