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

Ошибка выделения памяти

21.02.2018, 16:05. Показов 1679. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, пишу программу для неориентированных графов, создал класс вершина графа где храню указатели на другие вершины и класс самого графа где хранятся массив вершин графа ну и пару методов такие как добавления связи между двумя графами и так по мелочи.

Вот код:

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
// ANSIG_2.cpp: определяет точку входа для консольного приложения.
//
 
#include "stdafx.h"
#include <locale.h>
#include <cstdlib>
 
class Vertex{//точка
public:
    int index=0;
    Vertex **arr;
    int size = 0;
 
    Vertex(int index){
        this->index = index;
        arr = (Vertex**)calloc(size, sizeof(Vertex*));
    }
 
    void add_relations(Vertex* ver){
        size++;
        arr = (Vertex**)realloc(arr, sizeof(Vertex*)*size);
        arr[size - 1] = ver;
    }
};
 
class Graph{//граф
public:
    int length = 0;
    Vertex **arr;
 
    Graph(int length){
        this->length = length;
        arr = (Vertex**)calloc(length, sizeof(Vertex*));
        for (int i = 0; i < length; i++)
        {
            arr[i] = &Vertex(i+1);
        }
    }
 
    void add_relations(int beginning, int end) {//добавить связь между вершинами
        arr[beginning]->add_relations(arr[end]);
        arr[end]->add_relations(arr[beginning]);
    }
 
};
 
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(LC_ALL, "Russian");
    Graph graph(6);
    /*
    1   2   2   3   3   4   1   3
    2   3   4   4   5   6   3   6
    */
 
    graph.add_relations(1, 2);
    graph.add_relations(2, 3);
    graph.add_relations(2, 4);
    graph.add_relations(3, 4);
    graph.add_relations(3, 5);
    graph.add_relations(4, 6);
    graph.add_relations(1, 3);
    graph.add_relations(3, 6);
 
    for (int j = 0; j < graph.length; j++){
        printf("%d) ", graph.arr[j]->index);
        for (int i = 0; i < graph.arr[j]->size; i++)
        {
            printf("%d ", graph.arr[j]->arr[i]->index);
        }
    }
 
    getchar();
    getchar();
    return 0;
}
У меня при работе с этим кодом вылетает ошибка на 21 строчку где я расширяю динамический массив. Подскажите пожалуйста как исправить эту ошибку.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
21.02.2018, 16:05
Ответы с готовыми решениями:

Ошибка выделения памяти...
Когда я пытаюсь выделить память двумерному динамическому массиву, возникает ошибка &quot;Microsoft C++ exception: std::bad_alloc at memory...

Ошибка выделения памяти
Извиняюсь за то, что не умею гуглить. =) vector&lt;double&gt; v; v.resize(1000500); v.reserve(1000500); resize - просто говорит о...

Ошибка выделения памяти
char * host; host = (char*)malloc(wcslen(_host)); // выделяю память memset(host,'\0',wcslen(_host)); // очищаю host = '\0 ';...

13
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
21.02.2018, 17:26
Цитата Сообщение от iliya2018 Посмотреть сообщение
C++
1
2
3
4
        for (int i = 0; i < length; i++)
        {
            arr[i] = &Vertex(i+1);
        }
Здесь, собственно, что происходит?
0
0 / 0 / 0
Регистрация: 21.02.2018
Сообщений: 11
21.02.2018, 19:07  [ТС]
Цитата Сообщение от nd2 Посмотреть сообщение
Здесь, собственно, что происходит?
Тут я инициализирую массив вершин, передаю туда имя вершины.
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
21.02.2018, 19:13
Цитата Сообщение от iliya2018 Посмотреть сообщение
Тут я инициализирую массив вершин, передаю туда имя вершины.
Имя? Вижу, что пытаешься сохранить в массиве указателей адреса временных объектов.
0
0 / 0 / 0
Регистрация: 21.02.2018
Сообщений: 11
21.02.2018, 20:02  [ТС]
Цитата Сообщение от nd2 Посмотреть сообщение
Имя? Вижу, что пытаешься сохранить в массиве указателей адреса временных объектов.
Имя я передаю в конструктор, а временные объекты я потом передаю в массив указателей вершин.
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
21.02.2018, 20:12
Цитата Сообщение от iliya2018 Посмотреть сообщение
а временные объекты я потом передаю в массив указателей вершин.
Не временные объекты ты передаёшь, а адреса временных объектов. А ничего, что они временные? Создались, и исчезли. А ты их адреса в массиве сохраняешь? И смысл этого?
Цитата Сообщение от iliya2018 Посмотреть сообщение
C++
1
2
3
4
5
Graph graph(6);
    /*
    1   2   2   3   3   4   1   3
    2   3   4   4   5   6   3   6
    */
Под это массив маленький создаёшь. Нужно:
C++
1
Graph graph(8);
0
0 / 0 / 0
Регистрация: 21.02.2018
Сообщений: 11
22.02.2018, 06:58  [ТС]
Цитата Сообщение от nd2 Посмотреть сообщение
1 * 2 * 2 * 3 * 3 * 4 * 1 * 3
* * 2 * 3 * 4 * 4 * 5 * 6 * 3 * 6
это я написал связи в графе, в 1 строчке начало, во второй строчке конец и эти связи создаются между вершинами, одна вершина хранит указатель на вторую вершину, а вторая хранит указатель на первую, так реализована связь между вершинами.
Цитата Сообщение от nd2 Посмотреть сообщение
Не временные объекты ты передаёшь, а адреса временных объектов. А ничего, что они временные? Создались, и исчезли. А ты их адреса в массиве сохраняешь? И смысл этого?
исправил код на :
C++
1
2
3
4
5
for (int i = 0; i < length; i++)
        {
            Vertex ver(i + 1);
            arr[i] = &ver;
        }
но он все равно кидает ошибку когда я использую realloc
0
 Аватар для igorrr37
2869 / 2016 / 991
Регистрация: 21.12.2010
Сообщений: 3,727
Записей в блоге: 15
22.02.2018, 07:14
Лучший ответ Сообщение было отмечено iliya2018 как решение

Решение

iliya2018, у тебя объект Vertex ver(i + 1); создаётся на стеке и живёт до ближайшей скобки }. Создавай в куче.
1
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
22.02.2018, 12:40
Цитата Сообщение от iliya2018 Посмотреть сообщение
это я написал связи в графе,
Ещё раз:
Цитата Сообщение от nd2 Посмотреть сообщение
Под это массив маленький создаёшь. Нужно:
C++
1
Graph graph(8);
Цитата Сообщение от iliya2018 Посмотреть сообщение
исправил код на :
А ничего, что каждый твой объект ver живёт одну итерацию цикла?
Цитата Сообщение от iliya2018 Посмотреть сообщение
А ты их адреса в массиве сохраняешь? И смысл этого?
0
0 / 0 / 0
Регистрация: 21.02.2018
Сообщений: 11
22.02.2018, 14:37  [ТС]
а разве объект не живет до того момента пока мы храним на него указатель? и как тогда лучше решить эту проблему?
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
22.02.2018, 14:45
Цитата Сообщение от iliya2018 Посмотреть сообщение
а разве объект не живет до того момента пока мы храним на него указатель?
Нет.
Цитата Сообщение от iliya2018 Посмотреть сообщение
как тогда лучше решить эту проблему?
Уже написали.
1
║XLR8║
 Аватар для outoftime
1212 / 909 / 270
Регистрация: 25.07.2009
Сообщений: 4,360
Записей в блоге: 5
23.02.2018, 02:05
iliya2018, графы удобно держать в 2х представлениях:
1. матрицей смежности. Двумерный массив NxN или вектор

C++
1
2
3
4
std::vector<std::vector<bool>> v(N, std::vector<bool>(N));
// ...
v[i][node] = true;
v[node][i] = true;
2. списком смежности, где каждой вершите сответсвует вектор смежных вершин

C++
1
2
3
4
std::vector<std::vector<unsigned>> v(N);
// ...
v[i].push_back(node);
v[node].push_back(i);
Добавлено через 3 минуты
Цитата Сообщение от iliya2018 Посмотреть сообщение
создал класс
Ну а классами удобно инкапсулировать реализацию. Но точно не реализовывать свою матрицу смежности или список смежности.
1
0 / 0 / 0
Регистрация: 21.02.2018
Сообщений: 11
23.02.2018, 23:43  [ТС]
Исправил на :
C++
1
2
3
4
5
for (int i = 0; i < length; i++)
        {
            
            arr[i] = new Vertex(i + 1);
        }
эту ошибку он исправил, но потом почему то кидает на ошибку на 20 строчку где я увеличиваю size на 1.
Скрин скинул в приложение.
Самое интересное если глянуть на скрине то приходит ver с параметром size 3 что значит что он до этого уже создавал связи с другими вершинами
Миниатюры
Ошибка выделения памяти  
0
0 / 0 / 0
Регистрация: 21.02.2018
Сообщений: 11
23.02.2018, 23:57  [ТС]
Проблема вторая тоже решена, я выходил за массив не учел что числа отправляю с 1 до Н а обращаюсь с 0 до Н-1
Решение:
C++
1
2
3
4
void add_relations(int beginning, int end) {
        arr[beginning-1]->add_relations(arr[end-1]);
        arr[end-1]->add_relations(arr[beginning-1]);
    }
Всем спасибо большое за помощь
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
23.02.2018, 23:57
Помогаю со студенческими работами здесь

Ошибка выделения памяти
Добрый день , у меня проблема с выделением памяти 2-х мерному массиву. В общем такая конструкция. //Фукнция выделения памяти ДЛЯ 2-Х...

Ошибка выделения памяти(?)
Первый перечень(Который perech) записывается нормально,а вот второй(makeperech) крашит(объявления вроде те же,что и в первом перечне,не...

Ошибка выделения динамической памяти
IDE VS 2015. Собственно есть решение, состоящее из двух проектов. Первый это статическая библиотека #pragma once extern...

Ошибка выделения памяти для двумерного массива
void create(int **Matrix, int n, int m) { Matrix=new int*; for(int i=0; i&lt;n; i++) Matrix = new int; for(int i=0; i&lt;n;...

Утечки памяти без выделения памяти?
Человек использует _CrtDumpMemoryLeaks() для отлова утечек, и обратился ко мне в сязи с тем, что есть утечка, но памяти он никому не...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение Это мой обзор планшета X220 с точки зрения школьника. Недавно я решила попытаться уменьшить свой. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru