Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Visual C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.06.2011, 07:20   #1
Геральт
Новичок
Джуниор
 
Регистрация: 09.06.2011
Сообщений: 7
Сообщение Проболема с указателем на массив char

Доброго времени суток.
Задаю char массив и инициализирую его строкой как показано в коде ниже. Инициализируется нормально, строка выводится. Но когда начинает удалять массив, уходит в долгие раздумья, т.е. где-то в процессе реализации delete ход программы встает и ничего не делает.

char *s=new char[];
s="111";
cout<<s;
delete [] s;

Помогите разобраться, пожалуйста, в чем проблема.
Геральт вне форума Ответить с цитированием
Старый 09.06.2011, 08:24   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А все наверное дело в том что размер массива явно не указан. Это ИМХО, так как не спец в Сях.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 09.06.2011, 08:25   #3
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Цитата:
Сообщение от Геральт Посмотреть сообщение
char *s=new char[]; // выделение памяти под пустой массив?
s="111"; // Запись указателя на константную строку (выделенная память под пустой массив вообще не используется и остаётся висеть, т.е. потенциальная утечка)
cout<<s;
delete [] s;
Код:
char *s = new char[4];
strcpy(s,"111");
cout << s;
delete[] s;
pu4koff вне форума Ответить с цитированием
Старый 09.06.2011, 08:51   #4
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Цитата:
Сообщение от pu4koff Посмотреть сообщение
// Запись указателя на константную строку (выделенная память под пустой массив вообще не используется и остаётся висеть, т.е. потенциальная утечка)
Вы правы, но только отчасти. Под пустой массив выделяется вся размеченная по умолчанию область динамической памяти. При попытке удалить такой массив, происходит проверка этой памяти на наличие данных.
Отсюда и тормоза.
Утечка сдесь, конечно же есть, но до момента удаления динамического массива.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 09.06.2011, 09:23   #5
Геральт
Новичок
Джуниор
 
Регистрация: 09.06.2011
Сообщений: 7
По умолчанию

Ок, ясно. Спасибо за ответы.
Тогда такой вопрос:
данный код я переписывал по разному, в том числе указывал размер массива явно. Но когда я в него записываю данные именно так: s="111"; все равно происходят тормоза даже если размер массива указан явно. Почему так происходит?
Геральт вне форума Ответить с цитированием
Старый 09.06.2011, 11:52   #6
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Цитата:
Сообщение от Smitt&Wesson Посмотреть сообщение
Вы правы, но только отчасти. Под пустой массив выделяется вся размеченная по умолчанию область динамической памяти. При попытке удалить такой массив, происходит проверка этой памяти на наличие данных.
Отсюда и тормоза.
Утечка сдесь, конечно же есть, но до момента удаления динамического массива.
Ничего там не выделяется. В С++ нет никаких сборщиков мусора и никаких волшебных проверок по занятости памяти там нет. В памяти всегда есть какие-то данные, только они могут быть полезные или же "мусор", компилятор самостоятельно отличить "мусор" от полезной информации не может.
Цитата:
Сообщение от Геральт Посмотреть сообщение
Ок, ясно. Спасибо за ответы.
Тогда такой вопрос:
данный код я переписывал по разному, в том числе указывал размер массива явно. Но когда я в него записываю данные именно так: s="111"; все равно происходят тормоза даже если размер массива указан явно. Почему так происходит?
Потому что Си-строки присваивать так нельзя.
Это не копирование строк, а арифметика указателей. Вы по адресу s записываете адрес строки "111", при этом адрес на тот массив, под который выделялась память, теряется и вы его никак не удалите, т.е. получите утечку памяти.
pu4koff вне форума Ответить с цитированием
Старый 09.06.2011, 12:18   #7
Геральт
Новичок
Джуниор
 
Регистрация: 09.06.2011
Сообщений: 7
По умолчанию

Почему тогда в массив (если его объявить именно как массив) char'ов там можно записывать строки? И почему все виснет? Можно об этом по подробнее или же ссылочку на информацию?
Геральт вне форума Ответить с цитированием
Старый 09.06.2011, 12:41   #8
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Цитата:
Сообщение от Геральт Посмотреть сообщение
Почему тогда в массив (если его объявить именно как массив) char'ов там можно записывать строки?
Где там?
Цитата:
Сообщение от Геральт Посмотреть сообщение
И почему все виснет?
Виснет или вылетает ошибка?
Цитата:
Сообщение от Геральт Посмотреть сообщение
Можно об этом по подробнее или же ссылочку на информацию?
Про сишные строки написано во всех книгах по С++
pu4koff вне форума Ответить с цитированием
Старый 09.06.2011, 14:00   #9
Геральт
Новичок
Джуниор
 
Регистрация: 09.06.2011
Сообщений: 7
По умолчанию

Цитата:
Где там?
Например такой код: char s[4]="sss"; работает без проблем, а такой: char *s=new char[4]="sss"; - виснет. Вроде бы смысл одинаковый. Идентификатор массива это же указатель.
Цитата:
Виснет или вылетает ошибка?
Я ж говорю виснет. Т.е. мигает каретка и код дальше не исполняется. А когда закрываешь окно, сначала несколько секунд ожидает и только потом закрывается.
Цитата:
Про сишные строки написано во всех книгах по С++
Ну про такой вариант я еще нигде не читал, собственно потому на форум и полез.
Геральт вне форума Ответить с цитированием
Старый 09.06.2011, 14:13   #10
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2Геральт
скорей всего у тебя вылетает эксепшн с ошибкой доступа к памяти, а ты его не видишь, и думаешь, что висит.
Цитата:
Например такой код: char s[4]="sss"; работает без проблем
потому что это инициализация строки

Цитата:
char *s=new char[4]="sss"; - виснет
потому что это бред. если упростить, то это превратится в
Код:
char *s = new char[4];
s = "123";
выделенную память ты теряешь навсегда. и вызов delete [] приведет к неопределенному поведению, ибо твой указатель указывает на константный литерал, который нельзя менять
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
указателем на char в структуре H1ghlander Общие вопросы C/C++ 12 18.05.2013 23:49
Массив с указателем Seferus Общие вопросы C/C++ 2 13.11.2010 17:57
c++ массив char 0479 Общие вопросы .NET 2 19.09.2010 23:20
Массив типа char * das Ma:dchen Общие вопросы C/C++ 9 13.06.2010 17:21
проблема с указателем на массив Sergey.Voloxov Общие вопросы C/C++ 7 14.03.2010 17:47