Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
63 / 35 / 25
Регистрация: 17.07.2014
Сообщений: 457
1

Управление памятью с использованием malloc и free

05.11.2015, 19:35. Просмотров 711. Ответов 18
Метки нет (Все метки)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int n=3;
    int * v = (int*) malloc(n*sizeof(int)); // обьявил вектор из 3-х целочисельных елементов
    v[0] = 0;
    v[1] = 1;
    v[2] = 2; // заполнил три елемента
    cout << v[0] << " " << v[1] << " " << v[2] << endl; // вывод вполне ожидаемый: 2 3 4
    int *vc;
    vc= v;
    free(v); // сделал еще один указатель на начало вектора и затем освободил память
    cout << *vc << " "; // вывод вполне нормальный: 0
    vc++;
    cout << *vc<< " "; // вывод вполне нормальный: 0
    vc++;
    cout << *vc<< " "; // вывод СТРАННЫЙ: 2
Вопрос - почему не удаляет двойку ?
Второй вопрос: если я начну плюсовать указатель по вектору за его границу и туда присваивать елементы, не нарвусь ли я на память, которая будет занята чем то еще и отсюда вылет программы или еще что там?
И если ответ (да, нарушу), то как правильно делать вектор, способный к разширению ? (класс <vector> не предлагать, задача именно по этой темке с malloc)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.11.2015, 19:35
Ответы с готовыми решениями:

Работа с памятью через malloc,realloc и free
Вот начал работать с памятью в c++ и появилось несколько вопросов. 1 - r = (int...

Создание двунаправленного списка с использованием malloc(), free()
При заполнении списка вылазит ошибка &quot;Вызвано исключение по адресу 0x0FE7373F (vcruntime140d.dll) в...

Программирование с использованием ссылок. Управление памятью в С++
Народ, помогите программу написать, пожалуйста. Условие : Написать программу с использованием...

malloc/free
Делаю устройство. Atmega16. Принимает пакеты по RF. Всего полезных данных передается 512 байт....

18
Эксперт С++
4957 / 3063 / 456
Регистрация: 10.11.2010
Сообщений: 11,152
Записей в блоге: 10
05.11.2015, 19:50 2
Цитата Сообщение от maxm Посмотреть сообщение
Вопрос - почему не удаляет двойку ?
free не очищает память. Она просто помечает её свободной.

Цитата Сообщение от maxm Посмотреть сообщение
Второй вопрос: если я
Да.

Цитата Сообщение от maxm Посмотреть сообщение
И если ответ (да, нарушу), то как правильно делать вектор, способный к разширению ?
Никак.
0
Модератор
Эксперт С++
9597 / 8223 / 5023
Регистрация: 18.12.2011
Сообщений: 21,981
05.11.2015, 19:50 3
Освобождение памяти не обязывает ОС что-то туда записывать.
0
Эксперт C
23880 / 14825 / 3127
Регистрация: 24.12.2010
Сообщений: 31,690
05.11.2015, 19:55 4
Цитата Сообщение от maxm Посмотреть сообщение
то как правильно делать вектор, способный к разширению
Есть такая функция realloc. Ее несложно написать и самому, используя malloc, free.

Добавлено через 24 секунды
Цитата Сообщение от castaway Посмотреть сообщение
Никак.
???
0
Эксперт С++
4957 / 3063 / 456
Регистрация: 10.11.2010
Сообщений: 11,152
Записей в блоге: 10
05.11.2015, 20:00 5
Цитата Сообщение от Байт Посмотреть сообщение
???
Возможно я неправильно понял суть вопроса ТС. Но мне почему-то показалось что он хочет чтобы память расширялась автоматически.
maxm, поясни этот момент.
0
Эксперт C
23880 / 14825 / 3127
Регистрация: 24.12.2010
Сообщений: 31,690
05.11.2015, 20:15 6
Цитата Сообщение от castaway Посмотреть сообщение
показалось что он хочет чтобы память расширялась автоматически.
Вопрос снят (Все 3)
0
63 / 35 / 25
Регистрация: 17.07.2014
Сообщений: 457
05.11.2015, 20:51  [ТС] 7
Я понимаю, что free() не очищает, но ведь первые два элемента почему-то обнуляются
Можно ли пример realloc ?
0
Эксперт С++
4957 / 3063 / 456
Регистрация: 10.11.2010
Сообщений: 11,152
Записей в блоге: 10
05.11.2015, 21:03 8
Цитата Сообщение от maxm Посмотреть сообщение
Я понимаю, что free() не очищает, но ведь первые два элемента почему-то обнуляются
Потому что они чем-то затираются. Например той же самой free в своих целях.

Цитата Сообщение от maxm Посмотреть сообщение
Можно ли пример realloc ?
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
#include <cstdlib>
#include <new>
#include <cassert>
 
class MallocDynamicBuffer
{
    char* p;
public:
    explicit MallocDynamicBuffer(std::size_t initial = 0) : p(nullptr) {
       resize(initial);
    }
    ~MallocDynamicBuffer() { std::free(p); }
    void resize(std::size_t newSize) {
        if(newSize == 0) { // this check is not strictly needed, 
            std::free(p);  // but zero-size realloc is deprecated in C
            p = nullptr;
        } else {
            if(void* mem = std::realloc(p, newSize))
                p = static_cast<char*>(mem);
            else
                throw std::bad_alloc();
        }
    }
    char& operator[](size_t n) { return p[n]; }
    char operator[](size_t n) const { return p[n]; }
};
 
int main()
{
    MallocDynamicBuffer buf1(1024);
    buf1[5] = 'f';
    buf1.resize(10); // shrink
    assert(buf1[5] == 'f');
    buf1.resize(1024); // grow
    assert(buf1[5] == 'f');
}
http://en.cppreference.com/w/cpp/memory/c/realloc
0
:)
Эксперт С++
4763 / 3257 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
05.11.2015, 21:10 9
Цитата Сообщение от maxm Посмотреть сообщение
но ведь первые два элемента почему-то обнуляются
Происходить может всё что угодно, ибо попытка чтения памяти, которая не была тем или иным способом сделана доступной на чтение - неопределенное поведение (undefined behaviour - UB).
0
63 / 35 / 25
Регистрация: 17.07.2014
Сообщений: 457
05.11.2015, 21:15  [ТС] 10
C++
1
2
3
    int *p = NULL;
    realloc(p, sizeof(int));
    realloc(p, sizeof(int));
Давайте попроще, например это.
После первого вызова мое р будет указывать на 1 инт, а после второго уже на массив из двух ?
0
Эксперт С++
4957 / 3063 / 456
Регистрация: 10.11.2010
Сообщений: 11,152
Записей в блоге: 10
05.11.2015, 21:28 11
Цитата Сообщение от maxm Посмотреть сообщение
Давайте попроще, например это.
Ты читал описание функции realloc?
Неужели даже такая простая функция вызывает у тебя осложнения?
0
63 / 35 / 25
Регистрация: 17.07.2014
Сообщений: 457
05.11.2015, 21:46  [ТС] 12
Читал, поэтому спрашиваю, верно ли то, что я написал?
0
Модератор
8180 / 6051 / 806
Регистрация: 14.02.2011
Сообщений: 20,990
05.11.2015, 21:55 13
Цитата Сообщение от maxm Посмотреть сообщение
C++
1
2
3
4
 v[0] = 0;
    v[1] = 1;
    v[2] = 2; // заполнил три елемента
    cout << v[0] << " " << v[1] << " " << v[2] << endl; // вывод вполне ожидаемый: 2 3 4
я один вижу что то странное
записали 0 1 2 а вывод(вполне ожидаемый) 2 3 4

Добавлено через 1 минуту
Цитата Сообщение от maxm Посмотреть сообщение
Читал, поэтому спрашиваю, верно ли то, что я написал?
нет не верно
Цитата Сообщение от maxm Посмотреть сообщение
После первого вызова мое р будет указывать на 1 инт, а после второго уже на массив из двух ?
так же будет указывать на один
если хочешь 2 то пиши
C
1
realloc(p, 2*sizeof(int));
2
:)
Эксперт С++
4763 / 3257 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
05.11.2015, 21:57 14

Не по теме:

Цитата Сообщение от ValeryS Посмотреть сообщение
я один вижу что то странное
просто ты единственный, кто читает комментарии :)

Цитата Сообщение от maxm Посмотреть сообщение
верно ли то, что я написал?
Нет. realloc не добавляет, а перевыделяет. Т.е. аргументом передается новое суммарное кол-во памяти, а не инкремент.
0
Эксперт С++
4957 / 3063 / 456
Регистрация: 10.11.2010
Сообщений: 11,152
Записей в блоге: 10
05.11.2015, 21:58 15
Цитата Сообщение от maxm Посмотреть сообщение
верно ли то, что я написал?
Не верно.

Цитата Сообщение от ValeryS Посмотреть сообщение
я один вижу что то странное
записали 0 1 2 а вывод(вполне ожидаемый) 2 3 4
А я и не заметил...

maxm, почему для тебя ожидаемый вывод - это 2 3 4? Ведь ты ввёл 0 1 2.
0
Модератор
8180 / 6051 / 806
Регистрация: 14.02.2011
Сообщений: 20,990
05.11.2015, 22:02 16

Не по теме:

Цитата Сообщение от castaway Посмотреть сообщение
А я и не заметил...
но я же
Цитата Сообщение от Tulosba Посмотреть сообщение
единственный, кто читает комментарии


0
Эксперт C
23880 / 14825 / 3127
Регистрация: 24.12.2010
Сообщений: 31,690
05.11.2015, 22:06 17
C++
1
2
3
4
5
6
7
int *MyIntRealloc(char *v, int n, int nv)
{
  int *vc = (int *)malloc(sizeof(int)*n);
  for(int i=0; i<nv; i++) vc[i] = v[i];  // Можно через memcpy
  free(v);
  return vc;
}
Вот так, примерно, работает realloc. Правда, ему не нужно рассказывать про уже выделенную память (nc), он ее сам узнает, так как близко знает, как работает malloc. Все несколько упрощенно, но для задачи ТС работать должно
0
63 / 35 / 25
Регистрация: 17.07.2014
Сообщений: 457
05.11.2015, 22:07  [ТС] 18
почему для тебя ожидаемый вывод - это 2 3 4? Ведь ты ввёл 0 1 2.
Сначала было просто 2 3 4 потом поменял на 0 1 2 но коментарии забыл поменять
0
Эксперт C
23880 / 14825 / 3127
Регистрация: 24.12.2010
Сообщений: 31,690
05.11.2015, 22:11 19
Цитата Сообщение от maxm Посмотреть сообщение
Сначала было просто 2 3 4 потом поменял на 0 1 2 но коментарии забыл поменять
Во! А я сразу догадался!

Добавлено через 42 секунды

Не по теме:

Цитата Сообщение от maxm Посмотреть сообщение
<quote>
Тут в тегах скобки квадратные

0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.11.2015, 22:11

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

malloc, free error
Здравствуйте. Возникла следующая проблема. Код ниже: string http_headers = &quot;GET /index.asd...

Из malloc-free в new delete
Есть код с выделением памяти с помощью malloc, надо сделать с new delete Вроде сделал,...

Грабли malloc/free
С динамической памятью впервой работаю, от сюда и грабли Есть структура typedef struct {...

Освобождение памяти malloc free
В общем работаю над расширением для php (для тренировки в php и в c++ сразу) Суть дела вот в чем,...


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

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

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