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

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

Восстановить пароль Регистрация
 
snyppimylt
 Аватар для snyppimylt
7 / 7 / 1
Регистрация: 18.12.2011
Сообщений: 400
24.02.2013, 21:25     Динамическая память [new] #1
Если записать так:

C++
1
2
3
4
5
6
7
8
9
char *p;
p = new char[];
 
cin>>p;
 
for(int i=0; i<strlen(p); i++)
cout<<p[i]<<endl;
 
delete []p;
То он пишет про какую то точку останова, я вот не очень понимаю что это. Хотя вне компилятора в готовом виде (Relase) программа работает нормально. А если убрать delete [] p; то все будет работать нормально.

Объясните ламеру
Миниатюры
Динамическая память [new]  
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.02.2013, 21:25     Динамическая память [new]
Посмотрите здесь:

C++ Динамическая память
Динамическая память C++
C++ Динамическая память
Динамическая память C++
C++ Динамическая память
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Seroga7
 Аватар для Seroga7
6 / 6 / 1
Регистрация: 08.12.2012
Сообщений: 147
24.02.2013, 22:11     Динамическая память [new] #2
Я точно не уверен, сам не силен в указателях, но:

C++
1
2
3
4
5
6
7
8
9
char *p; //Указатель на СИМВОЛ а не массив символов
p = new char[]; // Массив символов
 
cin>>p;
 
for(int i=0; i<strlen(p); i++)
cout<<p[i]<<endl;
 
delete []p;
Попробуй сделать char **p
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
24.02.2013, 22:15     Динамическая память [new] #3
Цитата Сообщение от snyppimylt Посмотреть сообщение
C++
1
p = new char[];
Надо указывать размер массива.
Seroga7
 Аватар для Seroga7
6 / 6 / 1
Регистрация: 08.12.2012
Сообщений: 147
24.02.2013, 22:21     Динамическая память [new] #4
Цитата Сообщение от gray_fox Посмотреть сообщение
Надо указывать размер массива.
Так тут же динамическое выделение памяти! Это для того и делается, что-бы потом размер задать
ITcrusader
Эксперт C++
 Аватар для ITcrusader
176 / 162 / 8
Регистрация: 12.02.2013
Сообщений: 410
24.02.2013, 22:27     Динамическая память [new] #5
Цитата Сообщение от Seroga7 Посмотреть сообщение
Так тут же динамическое выделение памяти! Это для того и делается, что-бы потом размер задать
Нет) Путаешь тёплое с мягким))) Под динамическим выделением памяти подразумевается возможность определить размер массива на этапе выполнения, т.е. задать в кач-ве размера переменную, значение которой будет использовано в кач-ве размера массива. При статическом выделении в кач-ве размерности выступает константа, т.е. её значение известно на этапе компиляции.
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
24.02.2013, 22:33     Динамическая память [new] #6
Цитата Сообщение от Seroga7 Посмотреть сообщение
Так тут же динамическое выделение памяти! Это для того и делается, что-бы потом размер задать
Нет, для ввода строк произвольной длины существует класс std::string, а размер массива, динамически создаваемого оператором new[], должен задаваться при создании. Мало того, в С++ нет средства, аналогичного realloc из С, и изменить размер массива можно только создав новый и скопировав в него исходный.
Seroga7
 Аватар для Seroga7
6 / 6 / 1
Регистрация: 08.12.2012
Сообщений: 147
24.02.2013, 22:33     Динамическая память [new] #7
Цитата Сообщение от ITcrusader Посмотреть сообщение
Нет) Путаешь тёплое с мягким))) Под динамическим выделением памяти подразумевается возможность определить размер массива на этапе выполнения, т.е. задать в кач-ве размера переменную, значение которой будет использовано в кач-ве размера массива. При статическом выделении в кач-ве размерности выступает константа, т.е. её значение известно на этапе компиляции.
Точно, там как минимум переменную в квадратных скобках задать нужно...
ITcrusader
Эксперт C++
 Аватар для ITcrusader
176 / 162 / 8
Регистрация: 12.02.2013
Сообщений: 410
24.02.2013, 22:54     Динамическая память [new] #8
Цитата Сообщение от easybudda Посмотреть сообщение
Нет, для ввода строк произвольной длины существует класс std::string, а размер массива, динамически создаваемого оператором new[], должен задаваться при создании. Мало того, в С++ нет средства, аналогичного realloc из С, и изменить размер массива можно только создав новый и скопировав в него исходный.
Ага, а потому, используй библиотеку, если только то, чем ты занимаешься - не есть ритуал посвящения в C++ программисты)))
snyppimylt
 Аватар для snyppimylt
7 / 7 / 1
Регистрация: 18.12.2011
Сообщений: 400
24.02.2013, 22:58  [ТС]     Динамическая память [new] #9
Почитал я вас тут, половину все равно не понял, видимо литературы мало прочитал:

C++
1
2
3
4
5
6
7
8
9
10
11
char *p;
p = new char[10];
 
cin>>p;
 
for(int i=0; i<strlen(p); i++)
cout<<p[i]<<endl;
 
delete []p;
 
cout<<p;
Вот введу больше чем 10 символов, записывает, показывает и все работает нормально.

Добавлено через 2 минуты
Видимо перед работой в массиве как я понял, должно быть определено кол-во элементов.
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
24.02.2013, 22:58     Динамическая память [new] #10
Цитата Сообщение от snyppimylt Посмотреть сообщение
Вот введу больше чем 10 символов, записывает, показывает и все работает нормально.
Считай повезло, работать это не обязано.
snyppimylt
 Аватар для snyppimylt
7 / 7 / 1
Регистрация: 18.12.2011
Сообщений: 400
24.02.2013, 23:02  [ТС]     Динамическая память [new] #11
Цитата Сообщение от gray_fox Посмотреть сообщение
Считай повезло, работать это не обязано.
Поясните пожалуйста, в смысле "повезло" ?

Добавлено через 2 минуты
А как тогда записать столько символов сколько хочешь?
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
24.02.2013, 23:07     Динамическая память [new] #12
Цитата Сообщение от snyppimylt Посмотреть сообщение
Поясните пожалуйста, в смысле "повезло" ?
В случае "выделил память под 10 символов, записал > 10" будет обращение к невыделенной памяти. Это приводит к непредсказуемому поведению программы, т.е. может упасть, может нет, как получиться. В любом случае делать так не стоит.

Добавлено через 1 минуту
Цитата Сообщение от snyppimylt Посмотреть сообщение
А как тогда записать столько символов сколько хочешь?
Пользоваться классами, которые сами управляют выделением памяти, std::string, например.
snyppimylt
 Аватар для snyppimylt
7 / 7 / 1
Регистрация: 18.12.2011
Сообщений: 400
24.02.2013, 23:09  [ТС]     Динамическая память [new] #13
Цитата Сообщение от gray_fox Посмотреть сообщение
Пользоваться классами, которые сами управляют выделением памяти, std::string, например.
Хорошо, спасибо.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.02.2013, 23:13     Динамическая память [new]
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
ITcrusader
Эксперт C++
 Аватар для ITcrusader
176 / 162 / 8
Регистрация: 12.02.2013
Сообщений: 410
24.02.2013, 23:13     Динамическая память [new] #14
Цитата Сообщение от gray_fox Посмотреть сообщение
может упасть, может нет, как получиться.
Может писать непотребные письма начальству или запускать ракеты с ядерными боеголовками откуда-нибудь, и правда,
Цитата Сообщение от gray_fox Посмотреть сообщение
делать так не стоит.
Yandex
Объявления
24.02.2013, 23:13     Динамическая память [new]
Ответ Создать тему
Опции темы

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