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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.83
maSt
5 / 5 / 1
Регистрация: 28.02.2010
Сообщений: 166
#1

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

11.11.2012, 02:27. Просмотров 1665. Ответов 11
Метки нет (Все метки)

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

Управление памятью с использованием malloc и free - C++
int n=3; int * v = (int*) malloc(n*sizeof(int)); // обьявил вектор из 3-х целочисельных елементов v = 0; v = 1; v =...

В чем преимущества new и delete и могут ли они действительно заменить функции calloc, malloc, free, realloc? - C++
Язык программирования C поддерживает функции динамического управления пямятью: calloc, malloc, free, realloc - которые неподдерживают...

malloc/realloc - C++
есть следующий код: mmlist=(_mathmod*)malloc(sizeof(_mathmod)); *mmlist=_mathmod(mm); int i=0; ...

malloc, realloc - C++
У меня задан одномерный динамический массив таким образом: int *m1=new int; //n-количество элементов, вводится пользователем Далее этот...

Malloc realloc и C++ - C++
Подскажите, в C++ 11 выделение памяти по прежнему "нормально" выделять с помощью malloc и изменять размер realloc ? Или это уже прошлое?...

функции на основе realloc, malloc - C++
Подскажите как сократить написание "realloc", а то надоели эти писанины))) вот сделал уже следующее: size_t GetSize(void* Array) ...

11
ValeryS
Модератор
6681 / 5090 / 477
Регистрация: 14.02.2011
Сообщений: 17,090
11.11.2012, 02:30 #2
иде вопросы?
0
OhMyGodSoLong
~ Эврика! ~
1244 / 993 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
11.11.2012, 02:53 #3
Цитата Сообщение от maSt Посмотреть сообщение
1 - r = (int *)malloc((1)*sizeof(int)); как я понимаю, эта запись должна выделять памяти на 1 число типа int , но запуская цикл я вижу что туда спокойной влазит намного больше чисел. Почему или что я понял не так?
Потому что вы можете. Та память, куда вы пишете эти числа, не является частью выделенной. Там могут храниться значения других переменных. Вы можете туда писать всякую гадость, но с соответственными неопределёнными последствиями. Проверка границ массивов — это ваша головная боль, а не рантайма Си.

Цитата Сообщение от maSt Посмотреть сообщение
2 - освобождение памяти - на многих форумах показано освобождение памяти через for и free , но при попытке так сделать выкидывает ошибку и могу пользоваться только realloc. Почему так?
Если вы несколько раз выделяете память, надо несколько раз вызывать free(). Если один раз — то один раз без всяких циклов.
0
Kuzia domovenok
1892 / 1747 / 119
Регистрация: 25.03.2012
Сообщений: 5,936
Записей в блоге: 1
11.11.2012, 05:31 #4
код, который вылетает в студию!
0
maSt
5 / 5 / 1
Регистрация: 28.02.2010
Сообщений: 166
11.11.2012, 12:04  [ТС] #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;
    } 
}
вот такой код, кажется освобождаю всю память.
Но конечно же где-то ошибка.
0
Croessmah
Эксперт CЭксперт С++
13514 / 7673 / 867
Регистрация: 27.09.2012
Сообщений: 18,895
Записей в блоге: 3
Завершенные тесты: 1
11.11.2012, 13:03 #6
Что нужно ввести, чтобы программа максимально быстро дошла до строчки 151?
Просто не хочется разбираться с логикой программы
0
maSt
5 / 5 / 1
Регистрация: 28.02.2010
Сообщений: 166
11.11.2012, 13:11  [ТС] #7
1 -число проблем
5 - количество чисел
1 2 3 4 5 - сами числа
2 - количество подпроблем
2 1 - число % 2 = 1 выводим по хитроопой формуле некоторые числа
2 0 - так же
0
Croessmah
Эксперт CЭксперт С++
13514 / 7673 / 867
Регистрация: 27.09.2012
Сообщений: 18,895
Записей в блоге: 3
Завершенные тесты: 1
11.11.2012, 13:34 #8
Если посмотреть по коду, то вроде утечек нет. Добрался до строчки 146, там не освобожден только p, поэтому мне необходимо добраться до 152 строчки, где free(p) уже сделан и проверить утечки памяти, но чтобы я не вводил, у меня программа до туда не доходит
0
maSt
5 / 5 / 1
Регистрация: 28.02.2010
Сообщений: 166
11.11.2012, 13:41  [ТС] #9
Моя ошибка.
1
5
1 2 3 4 5
25
2
2 1
2 0
Забыл про 25.
0
Croessmah
Эксперт CЭксперт С++
13514 / 7673 / 867
Регистрация: 27.09.2012
Сообщений: 18,895
Записей в блоге: 3
Завершенные тесты: 1
11.11.2012, 13:46 #10
При таких данных у меня вообще программа "падает" где-то выход за границы выделенной памяти.
0
maSt
5 / 5 / 1
Регистрация: 28.02.2010
Сообщений: 166
11.11.2012, 13:58  [ТС] #11
Хмм, значит вот она и проблема. Осталось понять где выходит за границу. спасибо
Вот только у меня с такими данными программа не падает
0
Croessmah
Эксперт CЭксперт С++
13514 / 7673 / 867
Регистрация: 27.09.2012
Сообщений: 18,895
Записей в блоге: 3
Завершенные тесты: 1
11.11.2012, 14:00 #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() может и не работать.
1
11.11.2012, 14:00
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.11.2012, 14:00
Привет! Вот еще темы с ответами:

Помогите переделать malloc в realloc! - C++
Нужно что бы распределение памяти было realoc-ом, помогите пожалуйста Красным выделен malloc //---------------------ZADANIE...

Что быстрее/эффективнее malloc/realloc или new/delete? - C++
Всем привет. Год программировал на СИ под микроконтроллеры... Начал изучать с++... Всё ново, интересно... Доковырялся до STL... В процессе...

Использование calloc/realloc/free - C++
//calloc.cpp //Использование calloc #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #include &lt;iostream&gt; #include &lt;locale&gt; using...

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


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

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

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