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

Segmentation fault

07.02.2015, 21:31. Показов 1728. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток.
Есть 2 класса.
object
C++
1
2
3
4
5
6
7
8
9
10
class object{
    void (*f)(object*);
public:
    void setFunc(void (*func)(object*)){
        f = func;
    }
    void callFunc(){
        f(this);
    }
};
Имеет 2 метода. Первый записывает указатель на функцию, второй вызывает функцию по указателю.
Objects
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Objects{
    object **mass;
public:
    int size;
    Objects(){
        size = 0;
        mass = new object*[size];
    }
    void addObject(object *ob){
        mass[size++] = ob;
    }
    void callFuncs(){
        for(int c=0;c<size;c++){
            mass[c]->callFunc();
        }
    }
};
Имеет тоже 2 метода. Первый записывает адресс обекта в массив, второй вызывает метод call у всех обектов адресса которых записаны в массив.
Код целиком:
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
#include <iostream>
using namespace std;
 
class object{
    void (*f)(object*);
public:
    void setFunc(void (*func)(object*)){
        f = func;
    }
    void callFunc(){
        f(this);
    }
};
 
class Objects{
    object **mass;
public:
    int size;
    Objects(){
        size = 0;
        mass = new object*[size];
    }
    void addObject(object *ob){
        mass[size++] = ob;
    }
    void callFuncs(){
        for(int c=0;c<size;c++){
            mass[c]->callFunc();
        }
    }
};
 
void out(object *o){
    cout<<o<<endl;
}
 
int main(){
    Objects Main;
    object *n;
    for(int c=0;c<5;c++){
        n = new object;
        n->setFunc(out);
        Main.addObject(n);
    }
    cout<<Main.size<<endl;
    Main.callFuncs();
    return 0;
}
Если в цикле поставить число меньше 5(4 например) то ошибка не возникает.
Вопрос:
Почему возникает ошибка?
Как исправить?
Спасибо.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
07.02.2015, 21:31
Ответы с готовыми решениями:

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

Segmentation fault
Кусок кода: template &lt;typename Type&gt; class Queue { private: struct Elem { Elem*...

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

8
102 / 44 / 18
Регистрация: 08.01.2015
Сообщений: 97
07.02.2015, 21:46
Для начала. Создали массив размером ноль элементов.
Цитата Сообщение от YR17 Посмотреть сообщение
size = 0;
mass = new object*[size];
1
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
07.02.2015, 21:46
C++
1
2
        size = 0;
        mass = new object*[size];
Ошибка тут.
0
0 / 0 / 0
Регистрация: 07.02.2015
Сообщений: 4
07.02.2015, 21:54  [ТС]
А как правильно?
size инкремируется при добавлении елемента
0
102 / 44 / 18
Регистрация: 08.01.2015
Сообщений: 97
07.02.2015, 22:01
но массив не увеличивается. Или реаллокацию делайте или на вектор замените массив.
или статический массив указателей используйте.
C++
1
object *mass[100];
1
0 / 0 / 0
Регистрация: 07.02.2015
Сообщений: 4
07.02.2015, 22:05  [ТС]
Можно пример реаллокации?
0
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
07.02.2015, 22:12
Лучший ответ Сообщение было отмечено YR17 как решение

Решение

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

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
#include <iostream>
#include <vector>
 
using namespace std;
 
class object
{
  void (*f)(object*);
public:
  void setFunc(void (*func)(object*))
  {
    f = func;
  }
 
  void callFunc()
  {
    f(this);
  }
};
 
class Objects
{
  std::vector<object*> mass;
 
public:
  unsigned size() const
  {
    return mass.size();
  }
 
  void addObject(object *obj)
  {
    mass.push_back(obj);
  }
 
  void callFuncs() const
  {
    for (auto obj : mass)
    {
      obj->callFunc();
    }
  }
};
 
void out(object *o)
{
  cout<<o<<endl;
}
 
int main(){
    Objects Main;
    object *n;
    for(int c=0;c<5;c++){
        n = new object;
        n->setFunc(out);
        Main.addObject(n);
    }
    cout<<Main.size()<<endl;
    Main.callFuncs();
    return 0;
}
0
Заблокирован
07.02.2015, 22:14
YR17, лучше добавьте поле capacity, которое будет отвечать за максимальное число элементов в контейнере.
C++
1
2
3
size = 0;
capacity = 100;
mass = new object* [ capacity ];
0
102 / 44 / 18
Регистрация: 08.01.2015
Сообщений: 97
07.02.2015, 22:25
Цитата Сообщение от YR17 Посмотреть сообщение
Можно пример реаллокации?
что то типа этого, но лучше так не делать
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    void Realloc(size_t newsize)
    {
        object **newmass = new object *[newsize];
        for (size_t i = 0; i < size; i++)
        {
            newmass[i] = mass[i];
        }
        size = newsize;
        delete[] mass;
        mass = newmass;
    }
    void addObject(object *ob)
    {
        Realloc(size + 1);
        mass[size - 1] = ob;
    }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
07.02.2015, 22:25
Помогаю со студенческими работами здесь

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

Segmentation fault
Здравствуйте. Нужно динамически получить такое: char * a = {&quot;abc&quot;, NULL}; Пробую: char ** a; a = new char*; a = new char; ......

Segmentation fault
Пытаюсь реализовать генетический алгоритм на с++. Всего существует два класса: GeneticEngine, FitnessFunction. Класс FitnessFunction...

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

Segmentation fault :(
#include&lt;iostream&gt; #include&lt;fstream&gt; using namespace std; struct test{ int id; char name; }; struct first{


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
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 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru