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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 01.12.2012, 14:02   #1
RuVarez
Форумчанин
 
Аватар для RuVarez
 
Регистрация: 25.08.2010
Сообщений: 258
По умолчанию Выделение дин. памяти оператор new

Здравствуйте уважаемые знатоки! Подскажите пожалуйста:
Допустим есть указатель на массив символов, под который выделяем 10 байт памяти
Код:
char *Data = new char[10];
так вот собственно вопрос: если после инициализации данной переменной вызвать вот такое вот выражение:
Код:
Data = new char[3];
Data расширит свой размер до 13 байт, или наоборот станет 3 байта?
RuVarez вне форума Ответить с цитированием
Старый 01.12.2012, 14:05   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

первый указатель будет потерян вызвав утечку и будет заменен вторым.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 01.12.2012, 14:15   #3
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
Data расширит свой размер до 13 байт, или наоборот станет 3 байта?
Ни то, ни другое. Переменная Data - это указатель, её размер всегда sizeof(void*). Первое выражение присваивает ей значение, полученное в результате вычисления выражения new char[10]. Это выражение при вычислении, в качестве побочного эффекта, выделяет (помечает "занятым") в куче блок памяти размера не меньше 10*sizeof(char) + (служебная часть) байт и возвращает адрес в пределах этого куска, такой, что блок памяти размером 10*sizeof(char) байт от этого адреса находится в пределах блока и не пересекается со служебной частью.
Второе выражение присваивает Data значение, получаемое в результате вычисления выражения new char[3]. Ни в первом, ни во втором случае вычисляемое выражение в принципе "не знает", чему там собираются присваивать его результат и собираются ли вообще. Можно написать просто
Цитата:
new int[42];
и это будет совершенно легитимное выражение. Только бессмысленное и вредное.
Abstraction вне форума Ответить с цитированием
Старый 01.12.2012, 14:19   #4
RuVarez
Форумчанин
 
Аватар для RuVarez
 
Регистрация: 25.08.2010
Сообщений: 258
По умолчанию

Спасибо за ответы все понятно!
RuVarez вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Файлы и дин. переменные. Изменить с использованием дин. переменных. Маленыч Паскаль, Turbo Pascal, PascalABC.NET 4 07.06.2012 11:17
Осв. памяти дин. двумерного массива kineziz Общие вопросы C/C++ 3 06.06.2012 23:43
Распределение памяти. Динамическое выделение памяти с++ Tolian92 Помощь студентам 8 14.05.2012 21:44
из дин. дека в дин. стек (Borland С++) mego4el Помощь студентам 1 07.07.2011 14:41
выделение дин памяти и удаление Nekesh Общие вопросы C/C++ 2 11.10.2010 13:30