Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
PG
0 / 0 / 0
Регистрация: 21.09.2015
Сообщений: 9

Шаблоны классов, list (STL)

18.07.2016, 16:53. Показов 1917. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, столкнулся с проблемой, что при повторном выполнении цикла генерируется исключение "access violation", в чем может быть причина?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#include <list>
#include <iostream>
#include <algorithm>
 
using namespace std;
 
//--------------------------------------------------------------------------
template<class Type>
class AClass
{
public:
    int Id;
    list< AClass<Type> > a_list;
 
 
    AClass()
    {
        Id = 0;
        a_list.clear();
    }
 
    AClass(int iId)
    {
        Id = iId;
        a_list.clear();
    }
 
    AClass(const AClass<Type> &Obj)
    {
        Id = Obj.Id;
        a_list.clear();
    }
 
    ~AClass()
    {
        // без деструктора не компилируется,
        //пишет, что не может сгенерировать деструктор
    }
 
    bool operator==(const AClass &Obj)
    {
        return Id == Obj.Id;
    }
 
};
//--------------------------------------------------------------------------
template<class Type>
class BClass
{
protected:
    list< AClass<Type> > b_list;
 
public:
    bool AddList(int Id)
    {
        typename list< AClass<Type> >::iterator il = find(b_list.begin(), b_list.end(), Id);
        if (il == b_list.end())
        {
            AClass<Type> *A = new AClass<Type>(Id);
            b_list.push_back(*A);
            return true;
        }
        else
            return false;
    }
};
//--------------------------------------------------------------------------
 
int main()
{
    bool Run = true;
    while(Run)
    {
        BClass<int> B;
        cout<<B.AddList(5)<<endl;
 
                cout<<"Input Run(1/0): ";
                cin>>Run; cout<<endl;
 
       }
 
    system("pause");
    return 0;
}
Исключение возникает при повторном выполнении цикла (при удалении объекта B), компилятор указывает на строку 709 в файле list (если это может помочь)
Пользуюсь Embarcadero RAD Studio XE7
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
18.07.2016, 16:53
Ответы с готовыми решениями:

List (STL) не пользуется конструкторами копий базовых классов
Ситуация: Производный класс образован от двух базовых. Базовые классы не пустые, в одном хранится ссылка на картинку Grphics::TBitmap, а...

Работа с STL list + пропись List.h
Здравствуйте! Помогите, пожалуйста, разобраться с STL list. Нужно сделать программу в которой будет содержаться класс Student, прописать...

Шаблоны STL
Сгенерировать последовательность целых случайных чисел и сохранить их в массиве. Инициализировать контейнер valarray &lt;int&gt;...

16
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
18.07.2016, 18:20
Для чего в AClass список элементов AClass?
new убери.
0
PG
0 / 0 / 0
Регистрация: 21.09.2015
Сообщений: 9
18.07.2016, 18:29  [ТС]
Если AClass приводить к чему-то более жизненному, то объект данного класса может являться узлом графа, а a_list будет хранить в себе узлы, на которые будет указывать данный объект (узел).
Удаление new не помогло
0
 Аватар для HenryDukart
125 / 125 / 44
Регистрация: 05.10.2013
Сообщений: 462
18.07.2016, 19:21
PG,

C++
1
2
3
4
5
6
7
8
9
10
11
bool AddList(int Id)
    {
        typename list< AClass<Type> >::iterator il = find(b_list.begin(), b_list.end(), Id);
        if (il == b_list.end())
        {
            b_list.push_back(AClass<Type>(Id));
            return true;
        }
        else
            return false;
    }
Наверное, я не совсем понял, где возникает ошибка.
0
PG
0 / 0 / 0
Регистрация: 21.09.2015
Сообщений: 9
18.07.2016, 19:26  [ТС]
Такая же ошибка
0
 Аватар для HenryDukart
125 / 125 / 44
Регистрация: 05.10.2013
Сообщений: 462
18.07.2016, 19:28
PG, просто у меня ваш первоначальный код не выкидывает ошибок. Ошибка во времени выполнения появляется тогда, когда вы второй раз повторяете цикл?
0
PG
0 / 0 / 0
Регистрация: 21.09.2015
Сообщений: 9
18.07.2016, 19:32  [ТС]
Пробовал запустить данный код в Qt под Linux все прекрасно работает. А вот на Win10 в Embarсadero появляется ошибка)
Да, когда второй раз цикл выполняю)
0
 Аватар для HenryDukart
125 / 125 / 44
Регистрация: 05.10.2013
Сообщений: 462
18.07.2016, 19:35
PG, main надо изменить:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int main()
{
    bool Run = true;
    BClass<int> B;
    while (Run)
    {
        cout << B.AddList(5) << endl;
 
        cout << "Input Run(1/0): ";
        cin >> Run; cout << endl;
 
    }
 
    system("pause");
    return 0;
}
А то у вас все время создается новый список и в него добавляется элемент.
1
PG
0 / 0 / 0
Регистрация: 21.09.2015
Сообщений: 9
18.07.2016, 19:37  [ТС]
Понимаю, в этом и вопрос, что при повторном создании возникает ошибка, что не позволительно
0
 Аватар для HenryDukart
125 / 125 / 44
Регистрация: 05.10.2013
Сообщений: 462
18.07.2016, 19:42
PG, хм, ума не приложу, почему возникает ошибка. Windows 10 VS2015 все работает отлично.
0
PG
0 / 0 / 0
Регистрация: 21.09.2015
Сообщений: 9
18.07.2016, 19:43  [ТС]
Возможно дело в компиляторе, который я использую
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
18.07.2016, 19:55
Текст ошибки какой?
0
PG
0 / 0 / 0
Регистрация: 21.09.2015
Сообщений: 9
19.07.2016, 02:42  [ТС]
Такое исключение возникает: "access violation at 0x004029d7: read of address 0x00000000".

Добавлено через 6 часов 11 минут
Выяснил еще одну интересную вещь, что при создании глобального объекта класса AClass (например AClass<int> Temp выше функции main) проект перестает компилироваться и появляется такая ошибка: "[bcc32 Error] xmemory(44): E2125 Compiler could not generate default destructor for class '_List_nod<AClass<int>,allocator<AClass< int> > >::_Node'".
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
19.07.2016, 12:23
Лучший ответ Сообщение было отмечено PG как решение

Решение

Цитата Сообщение от PG Посмотреть сообщение
в чем может быть причина?
в представленном вами коде присутствует утечка:

C++
1
2
3
4
5
6
7
8
9
10
11
12
    bool AddList(int Id)
    {
        typename list< AClass<Type> >::iterator il = find(b_list.begin(), b_list.end(), Id);
        if (il == b_list.end())
        {
            AClass<Type> *A = new AClass<Type>(Id); //<--- никто не освобождает
            b_list.push_back(*A);
            return true;
        }
        else
            return false;
    }
но это не может быть причиной вашей проблемы.

вторая проблема:
C++
1
2
3
4
5
6
template<class Type>
class AClass
{
public:
    int Id;
    list< AClass<Type> > a_list;
здесь - UB.
несмотря на то, что это работает в современных версиях стандартной библиотеки,
тем не менее, стандарт не гарантирует этого.

у вас циклическая зависимость класса-хозяина от своих детей.

проблема заключается в том, что у вас в данных-членах фигурирует тип класса-хозяина.

что бы построить класс, нужно построить все его детей,
но посльку ребенок такого же типа,
то что бы его построить нужно построить всех его детей,
но поскольку ребенок такого же типа...

в современной стандартной библиотеке это прокатывает,
потому что в потрохах std::list используются ссылки/указатели
вместо "типов по значению".

но стандарт не гарантирует этого, и не накладывает здесь никаких ограничений.
вполне возможно, что версия библиотеки от вашего компилятора где то инстанцирует нечто,
что требует знание полного строения класса,
отсюда и проблемы с диструктором,
и может быть какие то глюки.

попробуйте сделать так:

C++
1
2
3
4
5
6
template<class Type>
class AClass
{
public:
    int Id;
    list< AClass<Type>* > a_list;
если заработает, значит диагноз верный.
1
PG
0 / 0 / 0
Регистрация: 21.09.2015
Сообщений: 9
19.07.2016, 12:28  [ТС]
Так пробовал, работает, спасибо огромное за ответ!
Не могли бы еще пояснить термин "UB"?
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
19.07.2016, 12:33
Цитата Сообщение от PG Посмотреть сообщение
Не могли бы еще пояснить термин "UB"?
"undefined behaviour"
("неопределенное поведение")

это - последствия ущербного некорректного кода.
означает, что раз вы написали некорректный код,
то вам больше никто ничего не гарантирует,
и произойти может все что угодно.

может быть будет работать.
может быть не будет.
может быть будет в зависимости от фазы луны.
а может быть компилятор вам открытку по почте пришлет.
1
PG
0 / 0 / 0
Регистрация: 21.09.2015
Сообщений: 9
19.07.2016, 12:37  [ТС]
Понял, еще раз спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
19.07.2016, 12:37
Помогаю со студенческими работами здесь

Шаблоны STL
Здраствуйте. У меня задача такая: робота со стандарными шаблонами. Мне нужно заполнить контейнер пользовательским типом даных, тоесть ...

Шаблоны классов (умножение классов)
Прошу помочь, нужно создать шаблон для умножения значений 2-х классов. Умножить классы просто получается, а вот с шаблонами какая то...

STL List
Вот в чем проблема, была дана задача, решить которую надо было с помощью Deque и List, Deque надобыло оформить через STL, а List написать...

List STL
В общем нужно создать класс STL c помощью list: CStudent.h #include &lt;string&gt; using namespace std; enum number_type{G1, G2,...

STL list
как вставить элемент в середину списка list STL? float list_insert_rand(int num) { srand (time(NULL)); int rand_num, rand_pos; ...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача №1: при указании работ (справочник РаботыПоРемонтуСпецтехники),. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru