Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
Andrey_Programm
12 / 12 / 10
Регистрация: 08.04.2016
Сообщений: 205
#1

Функции для работы с динамической памятью

10.06.2016, 10:17. Просмотров 701. Ответов 20
Метки нет (Все метки)

только начал изучать С++ сразу столкнулся с кучей вопросов.

задача такая : разработать функции Create,Resize и Remove для создания, изменения размера и удаления
массива целых чисел в динамической памяти.

в моей программе из 3 строчек сплошные ошибки.

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
#include<iostream>
 
using namespace std;
 int creat(int n);
 int resize(int *, int );
 void Remove(int* );
 
int main()
{
    int n=20, *l, s;
    l=creat(n);
    cout<<l<<endl;
    l=resize(l,s);
    remove(l);
}
 
int creat(int n)
{
    int* p;
    return p=new int[n];
}
 
int resize(int *p, int s)
{
    // не знаю как увеличить выделенную память в куче.
}
 
void Remove(int* p)
{
    delete[] p;
}
как расширить динамическую память в С++ ( тем более начиная с того адреса на котором стоял указатель) я не знаю(.

помогите пжалста.

пока что без всяких обработок на ошибки и тд. я ещё до этого не дошёл...
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.06.2016, 10:17
Ответы с готовыми решениями:

Средства для контроля работы с динамической памятью
Здравствуйте, товарищи! При написании программы на С++ встала проблема...

Объяснить код работы с динамической памятью
Объясните пожалуйста этот кусок кода : class test { public: int *p = new...

Разобраться в принципе работы задачч. (Работа с динамической памятью через указатели. )
Вот условие задачи: Создать массив из N целых чисел, N вводит пользователь....

Работа с динамической памятью. Ошибка в функции getline через посимвольный ввод
Было дано вот такое задание: В этой задаче вам необходимо написать функцию...

функции работы с памятью
нужно реализовать свою функцию memcpy. #include &lt;iostream&gt; using std::cout;...

20
stzer
111 / 87 / 54
Регистрация: 26.10.2013
Сообщений: 270
Завершенные тесты: 2
10.06.2016, 10:21 #2
как расширить динамическую память в С++ ( тем более начиная с того адреса на котором стоял указатель) я не знаю(.
Почитайте, как работает std::vector. Найдете ответы на ваши вопросы.
1
Andrey_Programm
12 / 12 / 10
Регистрация: 08.04.2016
Сообщений: 205
10.06.2016, 11:07  [ТС] #3
stzer, информация безусловно полезная +++, но в данный момент хотелось бы решить задачу стандартными способами выделения димнамической памяти при помощи new и delete
0
stzer
111 / 87 / 54
Регистрация: 26.10.2013
Сообщений: 270
Завершенные тесты: 2
10.06.2016, 11:11 #4
Andrey_Programm, выделяешь память, работаешь с ней. Все ок. В некоторый момент времени памяти не хватает для новых элементов, что делать? Создаешь новый массив большей размерности, и все элементы старого массива копируются в новый. Старый далее уничтожается. Размерность выделенного массива изменить нельзя.

Что конкретно не получается?
0
retmas
Жарю без масла
865 / 747 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
10.06.2016, 11:20 #5
Цитата Сообщение от Andrey_Programm Посмотреть сообщение
как расширить динамическую память в С++
в простом случае, если используется new/delete, выделить память нового размера, скопировать в нее значения из старого массива(если нужно), удалить старый кусок памяти. если же нужно не только расширить, но и уменьшить, то может понадобиться размер ранее выделенной памяти

Добавлено через 49 секунд
creat должна возвращать int*

Добавлено через 28 секунд
как и resize
0
Andrey_Programm
12 / 12 / 10
Регистрация: 08.04.2016
Сообщений: 205
10.06.2016, 11:54  [ТС] #6
stzer, retmas, я понимаю в этом то и что у меня и теорию выделения памяти я представляю, но сложность в том: 1) чтобы сделать это через функцию
2)Как расширить память в Си я представляю а в С++ нет. =/
3) про несоответствие типов - это тоже относится к этому вопросу никак не могу подогнать в любом случае когда я присваиваю указателю l какое то значение из функции мне вылезает ошибка
0
retmas
Жарю без масла
865 / 747 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
10.06.2016, 12:01 #7
так и ответили же, что нет в с++ функции наподобие realloc. пишем ручками в функции
C++
1
2
3
4
new_arr = new int[new_size];
//копируем старое содержимое из old_arr в new_arr, если нужно(понадобится знать размер old_arr)
delete[] old_arr;
return new_arr;
0
Andrey_Programm
12 / 12 / 10
Регистрация: 08.04.2016
Сообщений: 205
10.06.2016, 12:11  [ТС] #8
retmas, я же говорю что если делать это в майне то всё просто, а если делать через функции как у меня в задании то вылетают ошибки. код вверху перед вами. если можете поправить в нём буду благодарен...
0
UltraPenguin
229 / 95 / 27
Регистрация: 20.03.2014
Сообщений: 304
Завершенные тесты: 1
10.06.2016, 12:13 #9
Andrey_Programm,
Цитата Сообщение от retmas Посмотреть сообщение
Добавлено через 49 секунд
creat должна возвращать int*
Добавлено через 28 секунд
как и resize
Добавлено через 46 секунд
C++
1
2
3
4
int creat(int n)
{
    return new int[n];
}
1
stzer
111 / 87 / 54
Регистрация: 26.10.2013
Сообщений: 270
Завершенные тесты: 2
10.06.2016, 12:19 #10
Вот что вы хотите. Это будет работать, но это плохой код. Для вызова resize нам нужно знать размерность "расширяемого" массива.

Создайте класс, добавьте в поля счетчик, прикрепите шаблоны. Попробуйте, а мы вам поможем )

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
int * create(size_t num)
{
    return new int[num];
}
 
int * resize(int * array, size_t old_num, size_t new_num)
{
    int *new_array = create(new_num);
    std::copy(array, array + old_num, new_array);
    delete[] array;
    array = nullptr;
    return new_array;
}
1
retmas
Жарю без масла
865 / 747 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
10.06.2016, 12:22 #11
Лучший ответ Сообщение было отмечено Andrey_Programm как решение

Решение

Andrey_Programm, жаль, что не читаете, что вам пишут. разжевали, в рот положили, а глотать не можем?
вот ваш код
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
int* creat(int n);
int* resize(int *, int);
void Remove(int*);
 
int main()
{
    int n = 20, *l, s;
    l = creat(n);
    cout << l << endl;
    l = resize(l, s);
    Remove(l);
}
 
int* creat(int n)
{
    int* p;
    return p = new int[n];
}
 
int* resize(int *p, int s)
{
    int* new_arr = new int[s];
    // копируем старое содержимое из p в new_arr,
    // если нужно(понадобится знать размер p)
    // как хранить размер - тут возможны варианты...
    delete[] p;
    return new_arr;
}
 
void Remove(int* p)
{
    delete[] p;
}
1
UltraPenguin
10.06.2016, 12:25
  #12

Не по теме:


stzer, и получим код vector)))

Честно говоря не вижу академической ценности данного упражнения... А если это не для акадмических целей пишется, то смысла нет и подавно.

0
stzer
10.06.2016, 12:34
  #13

Не по теме:

UltraPenguin, Да, получим вектор. Для автора это дополнительная практика с классами и т.д. Все же лучше будет, чем вот так функции, возращающие указатели оставлять.

0
Andrey_Programm
12 / 12 / 10
Регистрация: 08.04.2016
Сообщений: 205
10.06.2016, 12:38  [ТС] #14
stzer
0
Миниатюры
Функции для работы с динамической памятью  
Andrey_Programm
12 / 12 / 10
Регистрация: 08.04.2016
Сообщений: 205
10.06.2016, 12:40  [ТС] #15
stzer, я только дошёл до классов. (только начинаю разбираться) а задание задано до них.
а вот что в вашем коде
0
stzer
111 / 87 / 54
Регистрация: 26.10.2013
Сообщений: 270
Завершенные тесты: 2
10.06.2016, 12:41 #16
Andrey_Programm, прототип функции resize измени

и creat
0
Andrey_Programm
12 / 12 / 10
Регистрация: 08.04.2016
Сообщений: 205
10.06.2016, 12:42  [ТС] #17
stzer, я только дошёл до классов. (только начинаю разбираться) а задание задано до них.
а вот что в вашем коде

Добавлено через 1 минуту
stzer, изменил прототип - не помогает...
0
Andrey_Programm
12 / 12 / 10
Регистрация: 08.04.2016
Сообщений: 205
10.06.2016, 12:45  [ТС] #18
Вот (
0
Миниатюры
Функции для работы с динамической памятью  
stzer
111 / 87 / 54
Регистрация: 26.10.2013
Сообщений: 270
Завершенные тесты: 2
10.06.2016, 12:46 #19
Andrey_Programm, вместо array = nullptr напиши array = NULL

и std::copy(array, array + n, new_array);
0
Andrey_Programm
12 / 12 / 10
Регистрация: 08.04.2016
Сообщений: 205
10.06.2016, 12:53  [ТС] #20
retmas, Да, всё , увидел. сори сообщения как то не приходили. странно

Добавлено через 3 минуты
stzer, исправил, но у меня ругается на строчку 26) int *new_array = create(s);
0
10.06.2016, 12:53
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.06.2016, 12:53

Ошибка с динамической памятью
Очень прошу помочь исправить ошибку в области дин.памяти. Проблема: 1. Шаг...

Работа с динамической памятью
При вызове деструктора ошибка: &quot;Ошибка C2227 выражение слева от &quot;-&gt;next&quot; должно...

Работа с динамической памятью!
Привет! Такая задача: Необходимо выделить(по N Кб) и освободить всю...


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

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

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