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

Освобождение динамической памяти

27.05.2018, 20:09. Показов 715. Ответов 3

Студворк — интернет-сервис помощи студентам
Здравствуйте!

Была задача реализовать сложение длинных чисел с помощью стеков. Сам стек реализовал просто, но всё же проблемы есть - при очистке массивов с delete[] возникает следующая ошибка:
Кликните здесь для просмотра всего текста


Сам код:
Кликните здесь для просмотра всего текста
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
#include <iostream>
 
 
int isEmpty(int*, int*, int);
int isFull(int*, int*, int);
int pop(int*, int*&, int);
void push(int*, int*&, int, int);
int top(int*, int*, int);
 
 
 
 
int main() {
 
    char num1[99], num2[99];
    scanf_s("%s", num1, 99); scanf_s("%s", num2, 99);
    int l1 = strlen(num1), l2 = strlen(num2);
    
    int* stack1 = new int[l1], *stack2 = new int[l2];
    int* ptr1 = stack1, *ptr2 = stack2;
 
    for (int i = 0; i < l1; ++i) push(stack1, ptr1, (int)num1[i] - 48, l1);
    for (int i = 0; i < l2; ++i) push(stack2, ptr2, (int)num2[i] - 48, l2);
 
    int l3 = fmax(l1, l2);
 
    int* stack3 = new int[l3], *ptr3 = stack3;
 
    int redundancy = 0, par;
    while (!isEmpty(stack1, ptr1, l1) && !isEmpty(stack2, ptr2, l2)) {
        par = pop(stack1, ptr1, l1) + pop(stack2, ptr2, l1);
        par += redundancy;
        push(stack3, ptr3, par % 10, l3);
        redundancy = par / 10;
    }
    while (!isEmpty(stack1, ptr1, l1)) {
        par = pop(stack1, ptr1, l1);
        par += redundancy;
        push(stack3, ptr3, par % 10, l3);
        redundancy = par / 10;
    }
    while (!isEmpty(stack2, ptr2, l2)) {
        par = pop(stack2, ptr2, l2);
        par += redundancy;
        push(stack3, ptr3, par % 10, l3);
        redundancy = par / 10;
    }
    while (!isEmpty(stack3, ptr3, l3))
        std::cout << pop(stack3, ptr3, l3);
 
    //stack1 = NULL;
    ptr1 = NULL;
 
    delete[] stack1;  //проблема сразу здесь
    delete[] stack2;
    delete[] stack3;
 
    std::cin.get();
}
 
int isEmpty(int* st, int* ptr, int size) {
    return st == ptr;
}
 
int isFull(int* st, int* ptr, int size) {
    return ptr - st >= size;
}
 
int pop(int* st, int*& ptr, int size) {
    if (!isEmpty(st, ptr, size))
        return *ptr--;
    else {
        std::cout << "Stack is empty";
        exit(1);
    }
}
 
void push(int* st, int*& ptr, int val, int size) {
    if (!isFull(st, ptr, size)) {
        ++ptr;
        *ptr = val;
    }
}
 
int top(int* st, int* ptr, int size) {
    if (!isEmpty(st, ptr, size))
        return *ptr;
    else {
        std::cout << "Stack is empty";
        exit(1);
    }
}


Помогите исправить, пожалуйста.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
27.05.2018, 20:09
Ответы с готовыми решениями:

Освобождение динамической памяти
Добрый день, объясните, пожалуйста, как правильно удалять выделенную динамическую память? Вот пример задачи, где массив произвольного...

Освобождение динамической памяти
После первого вызова функции(при повторном) пишет ошибку. В функции sort один из элементов массива становится недоступным для чтения. Если...

Освобождение динамической памяти в vs
Вообщем попался я тут, и так, код: //#define _CRT_SECURE_NO_WARNINGS добавить в vs #include &lt;iostream&gt; #include...

3
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
27.05.2018, 20:42
Добавление до инкремента должно быть.
0
0 / 0 / 1
Регистрация: 25.11.2016
Сообщений: 60
27.05.2018, 21:11  [ТС]
nmcf, исправил, теперь в третий массив записывается мусор, ибо при последнем инкременте как раз на несуществующий элемент указывать будет.
Если сделать "--ptr3;" - это же костыль будет. Или нет?
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
27.05.2018, 22:04
У тебя ptr и должен указывать на следующий свободный. Исправь top, чтобы он возвращал *(ptr-1).
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
27.05.2018, 22:04
Помогаю со студенческими работами здесь

Освобождение и выделение динамической памяти
Привет народ, такой вопрос: Допустим в main, указателю выделил память, всё разумеется нормально, читаю пишу всё ок, потом передал этот...

Выделение и освобождение динамической памяти в функциях
Каким образом происходит выделение и очистка динамической памяти для массивов (в частности) в функциях? Написал код, но почему то ошибка...

Освобождение динамической памяти из-под прямоугольной матрицы
Добрый вечер! При попытке очищения памяти после завершения работы программы с прямоугольной матрицей m на n мне выдаёт ошибку а-ля...

Резервирование памяти/освобождение памяти для трехмерного массива
Необходимо создать трехмерный массив (A), в котором элементы вдоль направления Z выли бы выровнены по 16 байт. Есть две проблемы: ...

освобождение памяти
Помогите найти ошибку, программа вилиться когда освобождаю память! Здесь выделения памяти double **CreateArray() { double...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
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