С Новым годом! Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/6: Рейтинг темы: голосов - 6, средняя оценка - 5.00
1 / 1 / 1
Регистрация: 31.12.2014
Сообщений: 9

Ошибка Access Violation при использовании vector внутри класса

15.03.2016, 00:17. Показов 1174. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Проблема в следующем: имеется пользовательский класс. Три поля в классе - векторы, один из которых двумерный. Первое создание экземпляра класса и использование его полей происходит без ошибок. Если этот экземпляр класса удалить а затем вновь создать - выбивает ошибку Access Violation. При пошаговом выполнении обнаружил, что ошибка возникает в конструкторе при резервировании памяти для двумерного массива. Надеюсь, кто-то подскажет, как избавится от данной неприятности...

Примерный код, при котором возникает ошибка:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include "Signal.h" 
 
Signal *sig; 
 
int main() 
{ 
    sig = new Signal(LB, HB, st, dl); //создаётся экземпляр класса 
    sig -> setSignal(); //заполняется вектор signal 
    sig -> calcDecomp(wLet, wLen); //заполняются вектора approx и details 
    delete(sig); // собственно, удаляем экземпляр 
    sig = new Signal(LBm HB, st, dl); //создание нового экземпляра - здесь возникает ошибка 
}


Структура класса:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Signal
    {
        private:
                unsigned long length;
                unsigned long decLev;
                double step, lBord, hBord;
                std::vector<double> signal;
                std::vector<double> approx;
                std::vector< std::vector<double> > details;
                std::vector<double> stemp;
        public:
                Signal(double lBord_, double hBord_, double step_, unsigned int DecLev_);
                void setSignal();
                void calcDecomp(const double wLet[], unsigned int wLen);
                void calcSynth();
                void PlotSignal(TFastLineSeries *Table);
                void PlotApprox(TFastLineSeries *Table);
                void PlotDetails(TFastLineSeries **Table);
                ~Signal();
    };


Конструктор:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Signal::Signal(double lBord_, double hBord_, double step_, unsigned int decLev_)
{
    lBord = lBord_;
    hBord = hBord_;
    step = step_;
    decLev = decLev_;
    length = (int)ceil(fabs((hBord - lBord)/step));
    length += (length % 2 == 0)?0:1;
    signal.reserve(1);
    approx.reserve(1);
    details.reserve(3);
    stemp.reserve(1);
    for(int i = decLev - 1; i >= 0; i--)
    {
        details[i].reserve(1);
    }
}


Деструктор:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
Signal::~Signal()
{
    std::vector<double>().swap(signal);
    std::vector<double>().swap(approx);
    for(int i = 0; i < decLev; i++)
    {
        std::vector<double>().swap(details[i]);
    }
    std::vector< std::vector<double> >().swap(details);
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
15.03.2016, 00:17
Ответы с готовыми решениями:

Access Violation при использовании delete[]
Здравствуйте. Столкнулся со следующей проблемой - при попытке очистить динамически выделенную память вылезает ошибка Access Violation....

Access violation при использовании экземпляра TIniFile
есть кнопка, в код нажатия на которую я пару дней назад.сегодня добавил ещё вот это AnsiString...

Access volation при использовании vector
Есть клас в котором обявлен вектор типа string. Когда я пытаюсь его вывести в ListBox вылетает ошибка, которая на скрине, при этом при...

4
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
15.03.2016, 09:51
Цитата Сообщение от lishuk_i Посмотреть сообщение
new Signal(LBm HB,
После LBm запятая пропущена, или это опечатка?
0
 Аватар для Lelik-pahan
1703 / 899 / 207
Регистрация: 25.11.2009
Сообщений: 1,848
15.03.2016, 12:11
lishuk_i, Мне кажется, ты некорректно используешь метод swap(). Это не есть удаление или очистка.
Тебе следует использовать метод clear().
0
1 / 1 / 1
Регистрация: 31.12.2014
Сообщений: 9
15.03.2016, 17:55  [ТС]
nick42, да, там опечатка

Добавлено через 1 минуту
Lelik-pahan, попробовал в разных комбинациях: swap потом clear, clear потом swap, просто clear - к сожалению, ничего не помогло(

Добавлено через 2 часа 23 минуты
Проблема решена. Может кому на будущее пригодится - не резервировать память отдельно под каждый вложенный вектор. В заполняющей функции создается временный вектор, который заполняется необходимыми значениями и через push_back() заносится во внешний вектор.
0
 Аватар для Lelik-pahan
1703 / 899 / 207
Регистрация: 25.11.2009
Сообщений: 1,848
15.03.2016, 19:13
lishuk_i, вектор тем и хорош, что для него не надо резервировать память. И никакой временный вектор не нужен. Что тебе мешает заносить элементы сразу в свой целевой вектор?

Добавлено через 6 минут
Ты в любой момент можешь дописать элемент в конец (push_back), вставить его посередине (insert), изменить размер вектора (resize), очистить вектор (clear). А работаешь с ним как с простым динамическим массивом.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
15.03.2016, 19:13
Помогаю со студенческими работами здесь

Ошибка при добавлении TSeries: Access Violation
Здравствуйте, помогите разобраться с ошибкой: void __fastcall TForm1::MyEvent(TObject *Sender) { TIniFile *ini=new...

Ошибка Access violation при передаче указателя в функцию
выделяю память для нужд програмных и соханяю его. char *resadres =(char*) VirtualAlloc (0, 50000, MEM_COMMIT | MEM_RESERVE,...

Ошибка при использовании класса
Решил написать чат. Написал маленький класс сервера: class ServChat { private: unsigned int unNumber; unsigned int umNumber; ...

Ошибка при использовании экземпляра класса
Всем здравствуйте. Есть класс, суть которого - одна функция записывающая массив вещественных значений в файл с определённым именем (один...

Ошибка при компилировании исправной программы: Access violation at address 501F084A in module 'vcl120.bpl'
Взываю ко всем умам форума!(( Недавно я здесь создавал тему про ошибку, возникающую при компилировании исправной программы. А ошибка такая:...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru