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

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

Войти
Регистрация
Восстановить пароль
 
Pro_ha
1 / 1 / 0
Регистрация: 07.06.2013
Сообщений: 32
#1

Resize вектора вызывает ошибку - C++

30.06.2015, 16:29. Просмотров 285. Ответов 8
Метки нет (Все метки)

C++
1
2
3
4
5
std::vector<MyClass*> vec;
vec.resize(1, NULL)
vec[0] = new MyClass();
 
vec.resize(5, NULL); // Тут возникает ошибка
Ошибка в файле xmemory в функции "_Destroy_range"

Если же перед использованием вектора зарезвервировать память vec.reserve(10), то ошибки не возникает.
Я так понимаю, когда увеличиваю вектор, он выделяет новую память с новым размером, и туда пытается перенести существующие указатели, удалив из старой памяти. Но зачем их удалять? Это ведь указатели.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.06.2015, 16:29
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Resize вектора вызывает ошибку (C++):

resize вектора векторов - C++
Необходимо удалить n элементов с конца вектора. В vector::erase необходимо передавать итератор. Т.к. итератора у меня нет, а есть...

Объявление вызывает ошибку - C++
1. где объявлять глобальные константы и переменные? в файле с ароматом .h? 2.Объявление extern fstream AccFile; вызывают ошибку ...

Перечисление в классе вызывает ошибку - C++
#pragma hdrstop #include &lt;iostream.h&gt; #include &lt;conio.h&gt; #include &lt;tchar.h&gt; ...

Шаблон класса деструктор вызывает ошибку - C++
Не так чего после того как доходит до деструктора выдает такую ошибку #include &quot;stdafx.h&quot; #include &lt;stdio.h&gt; #include...

Функция компилируется, но вызывает виндовс ошибку - C++
int main() int r=replace(str, c1, c2); return 0; int replace(char *str, char c1, char c2) { int count=0; ...

Выдает ошибку в функции в условии if. Не вызывает firstName, secondName и patron - C++
Доброго времени суток. Вот фрагмент кода. Выдает ошибку в функции, а именно в условии if. Не вызывает firstName, secondName и patron....

8
rikimaru2013
C++ Game Dev
2438 / 1132 / 240
Регистрация: 30.11.2013
Сообщений: 3,688
30.06.2015, 16:33 #2
он кажись перевыделяет память под свои итераторы, которые ссылаются на нужный адресс. Итераторы для производительности должны лежать вместе в памяти.

Насчёт ошибки - похоже, что вызывает delete [] по умолчанию.
0
Croessmah
Эксперт CЭксперт С++
13513 / 7671 / 866
Регистрация: 27.09.2012
Сообщений: 18,881
Записей в блоге: 3
Завершенные тесты: 1
30.06.2015, 16:34 #3
Код корректный и проблема не в нем(хотя смотря как там остальное устроено). Давайте минимальный компилируемый код, воспроизводящий проблему.
0
Pro_ha
1 / 1 / 0
Регистрация: 07.06.2013
Сообщений: 32
30.06.2015, 17:02  [ТС] #4
Цитата Сообщение от Croessmah Посмотреть сообщение
Код корректный и проблема не в нем(хотя смотря как там остальное устроено). Давайте минимальный компилируемый код, воспроизводящий проблему.
Попробовал сейчас обычный тип int (даже не указатель) в векторе расширить. Опять ошибка!
Но ошибки нет, если этот код выполнять в одном классе(не в перекрытом). И это видимо и вызывает ошибку.
У меня такая структура:

C++
1
2
3
4
5
6
7
8
9
10
Class B
{
  Class A //базовый класс
  {
    vector vec;
    vec.resize(1);
    vec[0] = 1;
  }
  A::vec.resize(5) - ошибка
}
Либо ошибка от того, что я пытаюсь из класса потомка изменить размер вектора базового класса.
Либо дело в том, что все эти классы с префиксом: __declspec(dllimport)
0
Croessmah
Эксперт CЭксперт С++
13513 / 7671 / 866
Регистрация: 27.09.2012
Сообщений: 18,881
Записей в блоге: 3
Завершенные тесты: 1
30.06.2015, 17:19 #5
Цитата Сообщение от Pro_ha Посмотреть сообщение
Попробовал сейчас обычный тип int (даже не указатель) в векторе расширить.
код давайте

Добавлено через 1 минуту
Цитата Сообщение от Pro_ha Посмотреть сообщение
У меня такая структура:
этот код и не должен работать... даже компилироваться не должен

Добавлено через 1 минуту
Цитата Сообщение от Pro_ha Посмотреть сообщение
//базовый класс
и это не базовый класс
Цитата Сообщение от Pro_ha Посмотреть сообщение
- ошибка
вызов функции в объявлении?
0
Pro_ha
1 / 1 / 0
Регистрация: 07.06.2013
Сообщений: 32
30.06.2015, 17:26  [ТС] #6
Ну вышеприведенный код просто упрощенная структура всего кода.
Рабочий код не получится дать. Там все сложно, есть что то наподобие "фремворка", который предоставляет базовый класс A через dll-ку.
Я создаю на основе этого класса свой класс "B". И пытаюсь из него изменить вектор класса A.
Ладно, спасибо ответы, видимо придется смириться и использовать reserve().
0
Croessmah
Эксперт CЭксперт С++
13513 / 7671 / 866
Регистрация: 27.09.2012
Сообщений: 18,881
Записей в блоге: 3
Завершенные тесты: 1
30.06.2015, 17:28 #7
Цитата Сообщение от Pro_ha Посмотреть сообщение
Там все сложно, есть что то наподобие "фремворка", который предоставляет базовый класс A через dll-ку.
экспортируете класс из DLL? Может в этом вся и проблема, а может и нет
0
Renji
1927 / 1325 / 299
Регистрация: 05.06.2014
Сообщений: 3,824
30.06.2015, 17:53 #8
Цитата Сообщение от Pro_ha Посмотреть сообщение
Ошибка в файле xmemory в функции "_Destroy_range"
Вангую что где-то (в абсолютно произвольном месте кода) вы вылетели за границы массива и затерли чужие данные. В момент затирания абсолютно ничего не произошло и код поехал дальше. А вот теперь эти затертые данные зачем-то понадобились вектору и ошибка ВНЕЗАПНО аукнулась. Лечение - обвешиваться assert как новогодняя елка и ставить дебаг-сборку.
1
Pro_ha
1 / 1 / 0
Регистрация: 07.06.2013
Сообщений: 32
01.07.2015, 04:31  [ТС] #9
Цитата Сообщение от Renji Посмотреть сообщение
Вангую что где-то (в абсолютно произвольном месте кода) вы вылетели за границы массива и затерли чужие данные
Вряд ли. Создал вектор в другом базовом классе (но также, экспоритруемый из dll). Ошибка не исчезла.
0
01.07.2015, 04:31
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.07.2015, 04:31
Привет! Вот еще темы с ответами:

Перенос проекта VisualStudio2008 на другой компьютер вызывает ошибку C2381 - C++
Возникла проблема при переносе проекта на другой компьютер Ситуация выглядит так: Есть готовый шаблон. Копирую его на другой...

Обращение к double** из метода dll вызывает ошибку памяти - C++
Есть класс который создает двухмерный массив. Этот класс экпортирую в dll и использую полученную библиотеку в программе С#. Все...

Заполнение вектора структурами. Найдите ошибку. - C++
Требуется заполнить вектор структурами и вывести на печать. Просто громадное количество ошибок. Понимание работы этой программы...

Помогите найти ошибку при копировании вектора - C++
vector&lt;byte&gt; tmp(8 + Addresses.size() * sizeof(int) + Data.size()); tmp.push_back(Data.data()); Data - vector &lt;byte&gt; byte - unsigned...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

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