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

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

Восстановить пароль Регистрация
 
kalabrod
0 / 0 / 0
Регистрация: 13.02.2015
Сообщений: 40
20.11.2016, 13:59     Динамическая память C++ #1
Народ, подскажите, плиз, что я делаю не так?
Надо посимвольно ститать строку, в процессе выделяя ей ровно столько памяти, сколько требуется (динамическая память).

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;
}
Подозреваю, что проблема с очисткой памяти. Код работает лишь на небольших строках.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.11.2016, 13:59     Динамическая память C++
Посмотрите здесь:

Динамическая память C++
Динамическая память C++
C++ Динамическая память
C++ Динамическая память.
C++ Динамическая память
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Lost17
168 / 35 / 13
Регистрация: 27.02.2016
Сообщений: 89
Завершенные тесты: 1
20.11.2016, 14:30     Динамическая память C++ #2
kalabrod, очень-очень кривая реализация...

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

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

C++ Динамическая память [new]
Динамическая память C++

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

Или воспользуйтесь поиском по форуму:
kalabrod
0 / 0 / 0
Регистрация: 13.02.2015
Сообщений: 40
21.11.2016, 19:52  [ТС]     Динамическая память C++ #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;
}
Yandex
Объявления
21.11.2016, 19:52     Динамическая память C++
Ответ Создать тему
Опции темы

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