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

Segmentation fault

28.05.2015, 13:21. Показов 1166. Ответов 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)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.05.2015, 13:21
Ответы с готовыми решениями:

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

Segmentation fault
При выводе второго объекта на экран объекте, вылетает с ошибкой. segmentation fault(core dumped). ...

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

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

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

Решение

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

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...
526 / 357 / 94
Регистрация: 11.09.2013
Сообщений: 2,040
28.05.2015, 18:43 5
Цитата Сообщение от pety Посмотреть сообщение
P.S со строками 32 - 33 все в порядке
точно?Меня тоже терзают смутные сомнения..
0
1 / 1 / 0
Регистрация: 11.12.2014
Сообщений: 116
28.05.2015, 21:22  [ТС] 6
Про строки 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
201 / 199 / 65
Регистрация: 06.10.2013
Сообщений: 552
29.05.2015, 08:02 7
Цитата Сообщение от pety Посмотреть сообщение
поделитесь им со мной. я всего лишь новичок, все поправки приветствуются
Традиционно указатели, которые никуда не указывают (как в случае с вершиной стека), инициализируются nullptr или NULL, чтобы можно было легко их проверять. Я согласен, что в вашей программе ваш метод будет работать, но, если вы будете работать в команде могут возникнуть проблемы из-за того, что разные разработчики будут ожидать разных значений. Половина по привычке будет сравнивать указать с nullptr и получит бесконечный цикл при обходе вашего стека.
0
1 / 1 / 0
Регистрация: 11.12.2014
Сообщений: 116
29.05.2015, 13:04  [ТС] 8
Цитата Сообщение от XZentus Посмотреть сообщение
обходе вашего стека
Поясните что вы имели ввиду. Ведь (насколько я понял) стек (как и очередь) не предполагает произвольного доступа к элементам.
Цитата Сообщение от XZentus Посмотреть сообщение
Половина по привычке будет сравнивать указать с nullptr
Какой указатель? Доступ к элементам возможен только через публичные методы, все указатели инкапсулированы.
Пожалуйста, объясните, а то я совсем запутался
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.05.2015, 13:04

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

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

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

Segmentation Fault
void Coder::set(const char * buf, size_t size) { if ((buf == nullptr)) { throw...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.