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

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

15.03.2016, 00:17. Показов 1228. Ответов 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
1709 / 905 / 207
Регистрация: 25.11.2009
Сообщений: 1,850
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
1709 / 905 / 207
Регистрация: 25.11.2009
Сообщений: 1,850
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
Ответ Создать тему
Новые блоги и статьи
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru