Вопрос по stl, c++ – Инициализация вектора в C ++

1

Я использую Векторы в моем коде.

Строка, которая вызывает ошибку, выглядит следующим образом:

<code>vector<Node> alt_seq ;
alt_seq = vector<Node>(1000);
for(int j=0; j<alt_cf.getNoOfNodes(i); j++)
{
    Node temp_node = *alt_itr;
    alt_itr++;
    alt_seq.push_back(temp_node);
    }
</code>

Линия :

<code> alt_seq.push_back(temp_node);
</code>

вызывает ошибку во время выполнения. Однако, если я инициализирую Вектор с некоторым начальным размером следующим образом:

<code>vector<Node> alt_seq(1000) ;
</code>

В этом случае код работает нормально. Однако я не хочу давать начальный размер, так как количество объектов в векторе будет изменяться во время выполнения. Пожалуйста, помогите мне. Я новичок в C ++.

Для вашей справки полная функция Method здесь:

http://pastebin.com/2dUFEui5

@ dirkgently Pastebin.com / g2n14awz ссылка на измененный код ... все еще выдает ошибку Abhinav Arora
Между прочим, ссылка на вставку не имеет определения для классаNode или dirkgently
vector<Node> alt_seq(1000) построит 1000Node объекты в векторе, что не то же самое, что не указание счетчика. Вашpush_back проблема звучит как возможная проблема с конструктором назначения / копированияNode. Можете ли вы показать объявление и определение класса? wkl
отредактируйте свой вопрос, чтобы включить в него необходимый код, не давайте нам ссылки на pastebin, которые в конечном итоге будут ссылаться на гниль Sam Miller
Похоже, проблема с классомNodeольшая тройка реализаций @. Можете ли вы показать нам определениеNode? dirkgently

Ваш Ответ

2   ответа
3

Node класс имеет член-указатель типаCombinedFragment* называетсяcfrag. Это создает висячие ссылки, если вы не определили свои собственные операторы копирования ctor и присваивания. Кроме того, необходим надлежащий dtor для предотвращения утечек, еслиNode отвечает за распределение / освобождениеcfrag. Если вы не хотите глубоко копироватьCombinedFragment вы можете использоватьshared_ptr.

Также, ctor по умолчанию дляNode, вероятно, даже не должно быть там (это оставляетcfrag в неинициализированное состояние).

Спасибо, я попробую это ... Если вы хотите посмотреть другие классы в проекте, код можно найти на GitHub Github.com / abhinavarora / MBT Abhinav Arora
@ AbhinavArora: попробуйте добавить правильную тройку и вернуться, если это не решит вашу проблему! dirkgently
Как ты сказал, я добавил большую тройку следующим образом Pastebin.com / g2n14awz Пожалуйста, дайте мне знать, если это дополнение правильно. Несмотря на внесенные выше изменения, он все равно выдает ошибку времени выполнения. Пожалуйста помоги. Я не понимаю свою ошибку. Abhinav Arora
this->cfrag = frag; выглядит подозрительно для меня. Когда вы копируете, вы делаете пару указателей на один и тот жеCombinedFragment объект. Теперь, если один из них удален, другой становится висящим указателем. Любой доступ к этомуcfrag объект - это UB. Итак, вместо необработанного указателя, попробуйте использоватьshared_ptr<CombinedFragment> как член, так что даже после удаленияNode объект, который вы не потеряетеCombinedFragment объект, которым поделились другие живыеNode объекты. НТН. dirkgently
0

vector объекты, а затем сделатьpush_back вы добавляете в конец вектора, то есть объекты, которые вы пытаетесь добавить, имеют значения 1001, 1002 .... и т. д. При объявлении 1000vector objects не выдает ошибку времени выполнения, я сначала посмотрю, каково определение по умолчанию (поскольку первые 1000 узловых узлов имеют значения по умолчанию), поскольку это не ошибка, а сравнение с фактическими данными, которые я пытаюсь загрузить. Надеюсь это поможет

Похожие вопросы