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

Segmentation fault

28.05.2015, 13:21. Показов 1898. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Кусок кода:
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
template <typename Type>
class Queue
{
    private:
 
        struct Elem
        {
            Elem* next;
            Type obj;
            Elem(const Type& object, Elem* pt = nullptr)
                : obj(object), next(pt) {}
        };
 
        Elem *first, *last;
        size_type length;
 
    public:
        Queue();
        Queue(const Type&, size_type num = 1);
        ~Queue();
 
        void push(const Type&);
       // ...
};
 
//...
 
template <typename Type>
void Queue<Type>::push(const Type& obj)
{
    Elem* temp = new Elem(obj);
    last->next = temp;
    last = temp;
 
    ++length;
}
Ловлю ошибку сегментации на строке
C++
1
last->next = temp;
Почему?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
28.05.2015, 13:21
Ответы с готовыми решениями:

Segmentation fault
Пишу лабу для универа. В общем необходимо использовать только свои функции, никаких, str... подобных функций использовать нельзя. ...

Segmentation fault
При выводе второго объекта на экран объекте, вылетает с ошибкой. segmentation fault(core dumped). #include &lt;iostream&gt; using...

Segmentation fault
Почему при таком варианте происходит Segmentation fault? vec3f trace(const Scene&amp; scene, const Ray&amp; ray) { const RenderObject*...

7
zzzZZZ...
 Аватар для dzrkot
527 / 358 / 94
Регистрация: 11.09.2013
Сообщений: 2,041
28.05.2015, 13:33
Лучший ответ Сообщение было отмечено pety как решение

Решение

а когда вы только создали объект у вас last куда по вашему указывает?
1
202 / 200 / 65
Регистрация: 06.10.2013
Сообщений: 552
28.05.2015, 13:34
Во-первых, сочетание строк 32 и 33 - присвоение экземпляру класса и его полю одного и того же.
Во-вторых, как (и где) объявлен и изначально инициализирован last?
0
1 / 1 / 0
Регистрация: 11.12.2014
Сообщений: 116
28.05.2015, 17:57  [ТС]
Весь код:

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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
// Queue.h
 
namespace my{
 
    // Exeptions
    class QueueIsEmpty{/* ... */};
    class ArgumentIsIncorrect{/* ... */};
 
    using size_type = unsigned long long;
 
 
    template <typename Type>
    class Queue
    {
        private:
 
            struct Elem
            {
                Elem* next;
                Type obj;
 
                Elem(const Type& object, Elem* pt = nullptr)
                    : obj(object), next(pt) {}
            };
 
 
            Elem *first, *last;
            size_type length;
 
        public:
 
            Queue();
            Queue(const Type&, size_type num = 1);
            ~Queue();
 
            Type& get() {return first->obj;}
            void pop();
            void safe_pop() {if (!empty()) pop();}
 
            void push(const Type&);
 
            bool empty(){return length == 0;}
 
            size_type size() {return length;}
 
    };
 
// Constructors
 
    template <typename Type>
    Queue<Type>::Queue()
        : first(nullptr), last(nullptr), length(0) {}
 
 
    template <typename Type>
    Queue<Type>::Queue(const Type& obj, size_type num ) : length(num)
    {
        if (num <= 0)
            throw ArgumentIsIncorrect();
 
        // first element
        first = last = new Elem(obj);
 
        // other elements
        for (size_type i = 1; i < num; ++i)
            push(obj);
 
    }
 
    template <typename Type>
    Queue<Type>::~Queue()
    {
        while (!empty())
            pop();
    }
 
 
// Public metods
 
    template <typename Type>
    void Queue<Type>::push(const Type& obj)
    {
        Elem* temp = new Elem(obj);
        last->next = temp;
        last = temp;
 
        ++length;
    }
 
 
    template <typename Type>
    void Queue<Type>::pop()
    {
        if (empty())
            throw QueueIsEmpty();
 
        Elem* temp = first->next;
        delete first;
        first = temp;
        
        --length;
    }
 
} // namespace
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
// test.cpp
 
#include "queue.h"
#include <iostream>
 
int main(int argc, char const *argv[])
{
    using namespace std;
 
    my::Queue<float> qu;
 
    for (int i = 0; i < 50; ++i)
        qu.push(i);
 
    while (!qu.empty()){
        cout << qu.get() << endl;
        qu.pop();
    }
 
    for (int i = 50; i < 75; ++i)
        qu.push(i);
 
    while (qu.size() != 1){
        cout << qu.get() << endl;
        qu.pop();
    }
 
    cout << qu.size();
}
Добавлено через 3 минуты
Разобрался! При создании пустой очереди last - нулевой, а обращение по нулевому указателю кидает ошибку, спасибо dzrkot
P.S со строками 32 - 33 все в порядке

Добавлено через 5 минут
Если кому интересно исправляется так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
template <typename Type>
    void Queue<Type>::push(const Type& obj)
    {
        if (empty())
            first = last = new Elem(obj);
        else
        {
            Elem* temp = new Elem(obj);
            last->next = temp;
            last = temp;
        }
 
        ++length;
    }
0
zzzZZZ...
 Аватар для dzrkot
527 / 358 / 94
Регистрация: 11.09.2013
Сообщений: 2,041
28.05.2015, 18:43
Цитата Сообщение от pety Посмотреть сообщение
P.S со строками 32 - 33 все в порядке
точно?Меня тоже терзают смутные сомнения..
0
1 / 1 / 0
Регистрация: 11.12.2014
Сообщений: 116
28.05.2015, 21:22  [ТС]
Про строки 32 - 33
Elem.next указывает на следующий элемент в очереди
Разберем алгоритм добавления нового элемента в очередь:

Нужно
1) Создать его копию оператором new (строка 31, но к ней вопросов не возникло...)

2) Сделать так, чтобы последний в данный момент элемент в очереди был связан с новым элементом (32 строка, last - последний элемент в очереди в данный момент)

3) Сделать новый элемент последним в очереди (строка 33)

Проверил, все нормально работает

P.S если у вас есть идея получше - прошу в студию поделитесь им со мной. я всего лишь новичок, все поправки приветствуются

Еще P.S
У читывая, что оператор '=' выполняется справа налево ветку else можно переписать так:
C++
1
last = last->next = new Elem(obj);
Этот вариант работает также
0
202 / 200 / 65
Регистрация: 06.10.2013
Сообщений: 552
29.05.2015, 08:02
Цитата Сообщение от pety Посмотреть сообщение
поделитесь им со мной. я всего лишь новичок, все поправки приветствуются
Традиционно указатели, которые никуда не указывают (как в случае с вершиной стека), инициализируются nullptr или NULL, чтобы можно было легко их проверять. Я согласен, что в вашей программе ваш метод будет работать, но, если вы будете работать в команде могут возникнуть проблемы из-за того, что разные разработчики будут ожидать разных значений. Половина по привычке будет сравнивать указать с nullptr и получит бесконечный цикл при обходе вашего стека.
0
1 / 1 / 0
Регистрация: 11.12.2014
Сообщений: 116
29.05.2015, 13:04  [ТС]
Цитата Сообщение от XZentus Посмотреть сообщение
обходе вашего стека
Поясните что вы имели ввиду. Ведь (насколько я понял) стек (как и очередь) не предполагает произвольного доступа к элементам.
Цитата Сообщение от XZentus Посмотреть сообщение
Половина по привычке будет сравнивать указать с nullptr
Какой указатель? Доступ к элементам возможен только через публичные методы, все указатели инкапсулированы.
Пожалуйста, объясните, а то я совсем запутался
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
29.05.2015, 13:04
Помогаю со студенческими работами здесь

Segmentation fault
Доброго времени суток. Есть 2 класса. object class object{ void (*f)(object*); public: void setFunc(void...

Segmentation fault
Всем привет. Пишу быдлокод для лабы в универе. Мне по определенному алгоритму необходимо получить из одного поколения особей, новое. ...

Segmentation fault
Доброго времени суток. Столкнулся в программе с ошибкой Segmentation fault. Вообще, задача отсортировать данные по одному из параметров, но...

Segmentation fault
не могу скинуть код по личным причинам. я использую строковые операторы strcmp, strcpy. выводит ошибку segmetation fault core dump....

Segmentation Fault
void Coder::set(const char * buf, size_t size) { if ((buf == nullptr)) { throw std::logic_error(&quot;buf == nullptr&quot;); } if...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru