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

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

Восстановить пароль Регистрация
 
Pro_ha
1 / 1 / 0
Регистрация: 07.06.2013
Сообщений: 32
30.06.2015, 16:29     Resize вектора вызывает ошибку #1
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), то ошибки не возникает.
Я так понимаю, когда увеличиваю вектор, он выделяет новую память с новым размером, и туда пытается перенести существующие указатели, удалив из старой памяти. Но зачем их удалять? Это ведь указатели.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
rikimaru2013
C++ Game Dev
 Аватар для rikimaru2013
2134 / 967 / 223
Регистрация: 30.11.2013
Сообщений: 3,235
30.06.2015, 16:33     Resize вектора вызывает ошибку #2
он кажись перевыделяет память под свои итераторы, которые ссылаются на нужный адресс. Итераторы для производительности должны лежать вместе в памяти.

Насчёт ошибки - похоже, что вызывает delete [] по умолчанию.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11823 / 6802 / 769
Регистрация: 27.09.2012
Сообщений: 16,870
Записей в блоге: 2
Завершенные тесты: 1
30.06.2015, 16:34     Resize вектора вызывает ошибку #3
Код корректный и проблема не в нем(хотя смотря как там остальное устроено). Давайте минимальный компилируемый код, воспроизводящий проблему.
Pro_ha
1 / 1 / 0
Регистрация: 07.06.2013
Сообщений: 32
30.06.2015, 17:02  [ТС]     Resize вектора вызывает ошибку #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)
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11823 / 6802 / 769
Регистрация: 27.09.2012
Сообщений: 16,870
Записей в блоге: 2
Завершенные тесты: 1
30.06.2015, 17:19     Resize вектора вызывает ошибку #5
Цитата Сообщение от Pro_ha Посмотреть сообщение
Попробовал сейчас обычный тип int (даже не указатель) в векторе расширить.
код давайте

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

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

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

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

Или воспользуйтесь поиском по форуму:
Pro_ha
1 / 1 / 0
Регистрация: 07.06.2013
Сообщений: 32
01.07.2015, 04:31  [ТС]     Resize вектора вызывает ошибку #9
Цитата Сообщение от Renji Посмотреть сообщение
Вангую что где-то (в абсолютно произвольном месте кода) вы вылетели за границы массива и затерли чужие данные
Вряд ли. Создал вектор в другом базовом классе (но также, экспоритруемый из dll). Ошибка не исчезла.
Yandex
Объявления
01.07.2015, 04:31     Resize вектора вызывает ошибку
Ответ Создать тему
Опции темы

Текущее время: 10:20. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru