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

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

Войти
Регистрация
Восстановить пароль
 
kalabrod
0 / 0 / 0
Регистрация: 13.02.2015
Сообщений: 40
#1

Динамическая память C++ - C++

20.11.2016, 13:59. Просмотров 228. Ответов 10
Метки нет (Все метки)

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

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
#include <iostream>
#include <cstdlib>
 
char *getline() {
 
    char * mass = new char [1];
    char * new_mass = new char [1];
    int i=0;
 
    while((mass[i] = std::cin.get()) != '\n' && !std::cin.eof()) { // пока не закончилась строка ввода
            delete [] new_mass;
            char * new_mass = new char [i+2]; // освобождаю и расширяю новый массив на 1
            for(int k = 0; mass[k]; ++k) new_mass[k] = mass[k]; // переписываю старый массив в новый, чтобы потом очистить его и расширить
            new_mass[i+1] = '\0'; // в конец нового массива добавляю ноль
 
            delete [] mass;
            char * mass = new char [i+2]; // освобождаю и расширяю старый массив на 1
            for(int k = 0; new_mass[k] != '\0'; ++k) mass[k] = new_mass[k]; // возобновляю все, что в нем было, из нового массива, чтобы расширить новый и не потярять данные
            i++;
    }
    delete [] mass; // освобождаю память
    return(new_mass); // возвращаю новый массив
}
 
int main() {
    std::cout << getline();
    delete [] getline();
    return 0;
}
Подозреваю, что проблема с очисткой памяти. Код работает лишь на небольших строках.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.11.2016, 13:59
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Динамическая память C++ (C++):

Статическая память,Динамическая память. - C++
a) Статическая память. Двумерный массив. Дан массив целых чисел. В массиве есть отрицательные числа. Определить координаты левого нижнего...

Динамическая память - C++
Помогите перевести массивы в динамическую память пожалуйста + почему-то не работает запись в файл(не перезаписывает). #include &lt;iostream&gt;...

Динамическая память - C++
Народ, если кому не сложно помогите переделать вот эту программу со структурами нужно сделать так чтобы для хранения данных она...

Динамическая память с++ - C++
Как использовать динамическую память в с++

Динамическая память - C++
Всем привет!!! взникла проблема с выполнением строки K=A++; при выполнении printf(&quot;\n__________ %d\n&quot;,K.gasaaa()); получаю левые...

Динамическая память - C++
в чем ошибка #include &lt;iostream&gt; #include &quot;conio.h&quot; using namespace std; class{A int a; double b; char s; }

10
Lost17
174 / 41 / 15
Регистрация: 27.02.2016
Сообщений: 128
Завершенные тесты: 1
20.11.2016, 14:30 #2
kalabrod, очень-очень кривая реализация...

Добавлено через 2 минуты
Сильно облегчит жизнь, если пользоваться библиотекой STL.

Добавлено через 4 минуты
Взять, к примеру, std::vector<char>. Считываем очередной символ, и вызываем у вектора метод push_back(). Нет проблем с выделением памяти, все выделится и освободится автоматически.
1
nd2
2328 / 1918 / 675
Регистрация: 29.01.2016
Сообщений: 6,266
20.11.2016, 14:30 #3
Цитата Сообщение от kalabrod Посмотреть сообщение
C++
1
for(int k = 0; mass[k]; ++k) new_mass[k] = mass[k];
// переписываю старый массив в новый, чтобы потом очистить его и расширить
Если cin.get() используешь, то откуда возьмётся '\0' в mass, чтобы, после первого чтения, сработало такое условие в for ()?
1
kalabrod
0 / 0 / 0
Регистрация: 13.02.2015
Сообщений: 40
20.11.2016, 14:32  [ТС] #4
STL , конечно, облегчит. Но хотелось бы понять, почему не работает такая "кривая" реализация.
0
Lost17
174 / 41 / 15
Регистрация: 27.02.2016
Сообщений: 128
Завершенные тесты: 1
20.11.2016, 14:40 #5
kalabrod, в main заведите указатель. Ему присваивайте результат getline() и его же удаляйте. Сейчас первый вызов функции теряет указатель на результат - строку, соответственно память из под неё не освобождается.
1
kalabrod
0 / 0 / 0
Регистрация: 13.02.2015
Сообщений: 40
20.11.2016, 14:44  [ТС] #6
А в mass и не нужен ноль, но нужен в new_mass, как завершение строки.
Видимо, я чего-то не понимаю (
0
Lost17
174 / 41 / 15
Регистрация: 27.02.2016
Сообщений: 128
Завершенные тесты: 1
20.11.2016, 14:53 #7
kalabrod,
C++
1
for(int k = 0; mass[k]; ++k)
в данном случае, цикл будет выполняться, пока при некотором i элемент mass[i] не будет равен '\0'
1
kalabrod
0 / 0 / 0
Регистрация: 13.02.2015
Сообщений: 40
20.11.2016, 15:02  [ТС] #8
в данном случае, цикл будет выполняться, пока при некотором i элемент mass[i] не будет равен '\0'
..или пока массив mass не закончится (что мне и надо). Или я не прав?
и это случится на 1 раньше, чем конец массива new_mass. тогда на оставшееся последнее место new_mass я помещаю ноль.
Я еще чайник совсем )
0
Lost17
174 / 41 / 15
Регистрация: 27.02.2016
Сообщений: 128
Завершенные тесты: 1
20.11.2016, 15:09 #9
kalabrod, дело в том, что mass - это не массив. Это участок памяти. А сам mass - указатель на начало этого участка. Признак окончания используемого вами участка памяти - это символ \0. Если его нет, то ничего не случится, и чтение пойдет по памяти не относящейся к Вашим данным, пока где-то не встретиться долгожданный \0. Но естественно, что это своеобразная ошибка, хотя компилятор Вам не запрещает так поступить.
А в цикле for второй параметр - это условие, если true - цикл идет на новое повторение, если false - прекращается. В Вашем случае любой символ mass[i], кроме \0 сопоставляется значению true, а вот \0 - значению false.
1
kalabrod
0 / 0 / 0
Регистрация: 13.02.2015
Сообщений: 40
20.11.2016, 15:18  [ТС] #10
Спасибо большое за ответы! Буду пока переваривать, разбираться. Позже сообщу к чему пришел )
0
kalabrod
0 / 0 / 0
Регистрация: 13.02.2015
Сообщений: 40
21.11.2016, 19:52  [ТС] #11
nd2,
Если cin.get() используешь, то откуда возьмётся '\0' в mass
Поправил.
Lost17,
в main заведите указатель. Ему присваивайте результат getline() и его же удаляйте.
Сделал.

Пробежался построчно в дебаге, "перепись" строк отрабатыват корректно примерно до 25-го элемента строки, почему-то. Не подскажите, в чем причина? Где-то я не правильно управляю выделением и освобождением памяти, не понимаю, где именно.

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
#include <iostream>
#include <cstdlib>
 
char *getline() {
 
    char * mass = new char [2];
    char * new_mass = new char [1];
    int i=0;
 
    while((mass[i] = std::cin.get()) != '\n' && !std::cin.eof()) { // пока не закончилась строка ввода
            mass[i+1] = '\0';
 
            delete [] new_mass;
            char * new_mass = new char [i+2]; // освобождаю и расширяю новый массив на 1
            for(int k = 0; mass[k]; ++k) new_mass[k] = mass[k]; // переписываю старый массив в новый, чтобы потом очистить его и расширить
            new_mass[i+1] = '\0'; // в конец нового массива добавляю 0
 
            delete [] mass;
            char * mass = new char [i+2]; // освобождаю и расширяю старый массив на 1
            for(int k = 0; new_mass[k]; ++k) mass[k] = new_mass[k]; // возобновляю все, что в нем было, из нового массива, чтобы расширить новый и не потярять данные
            i++;
    }
    delete [] mass; // освобождаю память
 
    return(new_mass); // возвращаю новый массив
}
 
int main() {
    char * a = getline();
    std::cout << a;
    delete [] a;
    return 0;
}
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.11.2016, 19:52
Привет! Вот еще темы с ответами:

Динамическая память - C++
Есть 2 массива одной размерности: int *m1 = new int , *m2 = new int ; где N, M некие числа. Собственно вопрос: как...

динамическая память.... - C++
Ввести двухмерном массив, для работы с массивом использовать указатель. Массив разместить в динамической памяти. Определение суммы...

Динамическая память - C++
Добрый вечер! Возникла у меня такая проблемка, нужно от статической памяти перейти к динамической. То ли уже голова не варит, то ли руки не...

Динамическая память - C++
Надо ввести массив из файла. Сам массив хранится в динамической памяти. Сколько я над прогой не бился, а вводит данные криво. С...


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

Или воспользуйтесь поиском по форуму:
11
Yandex
Объявления
21.11.2016, 19:52
Ответ Создать тему
Опции темы

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