Форум программистов, компьютерный форум CyberForum.ru

Работа с памятью через malloc,realloc и free - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.83
maSt
 Аватар для maSt
5 / 5 / 1
Регистрация: 28.02.2010
Сообщений: 166
11.11.2012, 02:27     Работа с памятью через malloc,realloc и free #1
Вот начал работать с памятью в c++ и появилось несколько вопросов.
1 - r = (int *)malloc((1)*sizeof(int)); как я понимаю, эта запись должна выделять памяти на 1 число типа int , но запуская цикл я вижу что туда спокойной влазит намного больше чисел. Почему или что я понял не так?
2 - освобождение памяти - на многих форумах показано освобождение памяти через for и free , но при попытке так сделать выкидывает ошибку и могу пользоваться только realloc. Почему так?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.11.2012, 02:27     Работа с памятью через malloc,realloc и free
Посмотрите здесь:

C++ Помогите переделать malloc в realloc!
C++ malloc/realloc
malloc, realloc C++
C++ Освобождение памяти malloc free
C++ Использование calloc/realloc/free
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,048
11.11.2012, 02:30     Работа с памятью через malloc,realloc и free #2
иде вопросы?
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
11.11.2012, 02:53     Работа с памятью через malloc,realloc и free #3
Цитата Сообщение от maSt Посмотреть сообщение
1 - r = (int *)malloc((1)*sizeof(int)); как я понимаю, эта запись должна выделять памяти на 1 число типа int , но запуская цикл я вижу что туда спокойной влазит намного больше чисел. Почему или что я понял не так?
Потому что вы можете. Та память, куда вы пишете эти числа, не является частью выделенной. Там могут храниться значения других переменных. Вы можете туда писать всякую гадость, но с соответственными неопределёнными последствиями. Проверка границ массивов — это ваша головная боль, а не рантайма Си.

Цитата Сообщение от maSt Посмотреть сообщение
2 - освобождение памяти - на многих форумах показано освобождение памяти через for и free , но при попытке так сделать выкидывает ошибку и могу пользоваться только realloc. Почему так?
Если вы несколько раз выделяете память, надо несколько раз вызывать free(). Если один раз — то один раз без всяких циклов.
Kuzia domovenok
 Аватар для Kuzia domovenok
1883 / 1738 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
11.11.2012, 05:31     Работа с памятью через malloc,realloc и free #4
код, который вылетает в студию!
maSt
 Аватар для maSt
5 / 5 / 1
Регистрация: 28.02.2010
Сообщений: 166
11.11.2012, 12:04  [ТС]     Работа с памятью через malloc,realloc и free #5
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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
#include <iostream>
using namespace std;
#include <stdlib.h>
#include <fstream>
#include <stdio.h>
 
 
 
 
 
int main()
{
    int prt=1,iloscprobl,ilosc,minus,hgr,zm1=1,zm3=0,ilosc2=0,ilosc3=0,podproblem,count=0,counter=0,counter2=0,kur1=0,kur2=0,kur3=0,kur4=3,kur5=1,count2=0,count3=0,count4=0,mallco=0;
    int *p,*r,*s,*t;
    cin >> iloscprobl;//1 
    if (iloscprobl==0)
    {}
    else{
        do
        {
            cin >> ilosc;
            ilosc2 = ilosc;
            ilosc3=ilosc2;
            p = (int *)malloc((ilosc)*sizeof(int));
            for (int i = 0; i != ilosc; i++)
            {
                cin >> *(p+i) ;
            }
            cin >> minus;
            int  k=1;
            if (minus>ilosc) {
    
            }
            else
            {
                for(int j=1;j<ilosc;j++)
                {
                    
                    if ((j/minus)!=k)
                    {
                        *(p+j-prt)=*(p+j+kur1-prt);
                    }
                    else
                    {
                        kur1++;
                        k++;
                        prt++;
                    }
                }
                ilosc2=ilosc-kur1;
                p = (int *)realloc(p,(ilosc-kur1)*sizeof(int));
 
            }
 
    
 
 
 
 
 
 
 
            cin >> podproblem;
            do
            {
 
                cin >> kur2;
                mallco = (ilosc2 / kur2)/3;
                if (mallco > 2)
                {
                    r = (int *)malloc((mallco+1)*sizeof(int));
                    s = (int *)malloc((mallco+1)*sizeof(int));
                    t = (int *)malloc((mallco+1)*sizeof(int));
                }
                else
                {
                    r = (int *)malloc((1)*sizeof(int));
                    s = (int *)malloc((1)*sizeof(int));
                    t = (int *)malloc((1)*sizeof(int));
                }
                cin >> kur3;
                int a=0;
                for (int i = 0; i != ilosc3; i++)
                {
                    if (*(p+i)%kur2 == kur3)
                    {
                        count3++;
                        kur5 = count3%3;
                        switch(kur5)
                        {
                        case 1: *(r+count2) = *(p+i-count);break;
                        case 2: *(s+count2) = *(p+i-count);break;
                        case 0: *(t+count2) =*(p+i-count);count2++;break;
                        }
 
                    }
                    else
                    {
                        *(p+i-zm1) = *(p+i-zm1+count4+1);
                        zm1++;
                        count4++;
                    }
 
                }
                if (kur5 == 1)
                {
                    *(s+count2)=0;
                    *(t+count2)=0;
                }
                else
                {
                    if (kur5 == 2)
                    {
                        *(t+count2)=0;
                    }
                    else{}
                }
                ilosc2=ilosc2-count3;
                p = (int *)realloc(p,(ilosc2)*sizeof(int));
 
 
                for (int i =1;i!=count2+1;i++)
                {
                    *(r+i) += *(s+i) -*(r+i-1);
                }
                for (int i =0;i!=count2+1;i++)
                {
                    if (*(r+i)>0)
                    {
                        count++;
                        cout << *(t+i) << " ";
                    }
                }
                cout << endl;
                cout << count;
                cout << endl;
                counter2++;
                ilosc3 = ilosc2 - count3;
                count3 = 0;
                count4 = 0;
                count2 = 0;
                zm1=1;
                count = 0;
                free(r);
                free(s);
                free(t);
            }
            while (counter2!=podproblem);
 
    
            free(p);
            counter++;
        }
        while (iloscprobl != counter);
        return 0;
    } 
}
вот такой код, кажется освобождаю всю память.
Но конечно же где-то ошибка.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11838 / 6817 / 771
Регистрация: 27.09.2012
Сообщений: 16,909
Записей в блоге: 2
Завершенные тесты: 1
11.11.2012, 13:03     Работа с памятью через malloc,realloc и free #6
Что нужно ввести, чтобы программа максимально быстро дошла до строчки 151?
Просто не хочется разбираться с логикой программы
maSt
 Аватар для maSt
5 / 5 / 1
Регистрация: 28.02.2010
Сообщений: 166
11.11.2012, 13:11  [ТС]     Работа с памятью через malloc,realloc и free #7
1 -число проблем
5 - количество чисел
1 2 3 4 5 - сами числа
2 - количество подпроблем
2 1 - число % 2 = 1 выводим по хитроопой формуле некоторые числа
2 0 - так же
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11838 / 6817 / 771
Регистрация: 27.09.2012
Сообщений: 16,909
Записей в блоге: 2
Завершенные тесты: 1
11.11.2012, 13:34     Работа с памятью через malloc,realloc и free #8
Если посмотреть по коду, то вроде утечек нет. Добрался до строчки 146, там не освобожден только p, поэтому мне необходимо добраться до 152 строчки, где free(p) уже сделан и проверить утечки памяти, но чтобы я не вводил, у меня программа до туда не доходит
maSt
 Аватар для maSt
5 / 5 / 1
Регистрация: 28.02.2010
Сообщений: 166
11.11.2012, 13:41  [ТС]     Работа с памятью через malloc,realloc и free #9
Моя ошибка.
1
5
1 2 3 4 5
25
2
2 1
2 0
Забыл про 25.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11838 / 6817 / 771
Регистрация: 27.09.2012
Сообщений: 16,909
Записей в блоге: 2
Завершенные тесты: 1
11.11.2012, 13:46     Работа с памятью через malloc,realloc и free #10
При таких данных у меня вообще программа "падает" где-то выход за границы выделенной памяти.
maSt
 Аватар для maSt
5 / 5 / 1
Регистрация: 28.02.2010
Сообщений: 166
11.11.2012, 13:58  [ТС]     Работа с памятью через malloc,realloc и free #11
Хмм, значит вот она и проблема. Осталось понять где выходит за границу. спасибо
Вот только у меня с такими данными программа не падает
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.11.2012, 14:00     Работа с памятью через malloc,realloc и free
Еще ссылки по теме:

функции на основе realloc, malloc C++
Malloc realloc и C++ C++
C++ Можно ли выделять память под объект класса с помощью функций calloc, malloc или realloc?

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

Или воспользуйтесь поиском по форуму:
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11838 / 6817 / 771
Регистрация: 27.09.2012
Сообщений: 16,909
Записей в блоге: 2
Завершенные тесты: 1
11.11.2012, 14:00     Работа с памятью через malloc,realloc и free #12
Цитата Сообщение от maSt Посмотреть сообщение
Вот только у меня с такими данными программа не падает
Многое зависит от платформы и случая.
Например, тут:
C++
1
2
3
4
                for (int i =1;i!=count2+1;i++)
                {
                    *(r+i) += *(s+i) -*(r+i-1);
                }
в r всего выделено 4 байта под одно значение int.
У Вас цикл получается от 1 до 2.
Код *(r+i) будет выглядеть как *(r+1) - это выход за пределы уже. Собственно по этому free() может и не работать.
Yandex
Объявления
11.11.2012, 14:00     Работа с памятью через malloc,realloc и free
Ответ Создать тему
Опции темы

Текущее время: 15:40. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru