![]() |
Модераторы: bsa |
![]() ![]() ![]() |
|
jeff |
|
|||
Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 24.1.2012 Репутация: нет Всего: нет |
Всем привет!
Код и ниже 2 вопрома по нему
Все работает до вопроса N2 1) Почему не работает просто new pperson , а приходится приводить тип 2) На delete pp программа виснет. Что не так? Всем спасибо............... Модератор: не забываем пользоваться кнопочкой "Код" Это сообщение отредактировал(а) bsa - 24.1.2012, 17:15 |
|||
|
||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
||||
|
||||
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 21 Всего: 135 |
данная конструкция выделяет память под указатель (4 байта на 32-х битной ОС и 8 - на 64-х битной), а не под структуру, и возвращает указатель на указатель на структуру, а не указатель на структуру сделай так, и будет тебе счастье ![]()
и можешь спокойно делать и пользуйся кнопочкой код -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
jeff |
|
|||
Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 24.1.2012 Репутация: нет Всего: нет |
Все понял, спасибо, здОрово.
Добавлено через 9 минут и 23 секунды Осталось, все-таки непонятным, почему в "правильном" и "неправильном" корректно отработалпа функция changePerson2. ? С указателем и с указателем на указатель в качестве параметра.. |
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
jeff, это тебе кажется, что "корректно". Результат ошибки может проявиться значительно позже.
Никогда не делай "typedef something *psomething". Значительно проще писать каждый раз звездочку для создания указателя. Да и ошибок будет меньше. Например: "const something *x" и "const psomething x" - это разные вещи!!! |
|||
|
||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
||||
|
||||
jeff |
|
||||
Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 24.1.2012 Репутация: нет Всего: нет |
Я неопытный.
и
дают одинаковый(и предсказуемый) результат работы changePerson2 Можно ли считать что при pp = pperson(new pperson); выполняется как бы инициализация массива person* и в функцию передается первый(и единственный) элемент массива, и поэтому changePerson2 работает? То что при освобождении памяти возникают проблемы, уже понял, я говорю только о функции changePerson2 |
||||
|
|||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
Нет, это они в этот раз дали одинаковый результат, разница в том, что первый вариант по стандарту должен работать всегда, в то время как второй может вызвать ошибку записи, логическую ошибку где-то в другом участке кода или землетрясение в Бурунди, результат совершенно непредсказуем. Это сообщение отредактировал(а) azesmcar - 25.1.2012, 08:53 |
|||
|
||||
borisbn |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 21 Всего: 135 |
jeff, посмотри внимательно этот код
http://liveworkspace.org/code/6c737cc1d8e5...635a191a48ca81f и представь, что arr описан как int arr[ 1 ]; в твоём случае происходит примерно то же самое. ты выделил память под указатель, т.е. 4 байта (на 32-х разрядной ОС), а считаешь, что выделил память под структуру, т.е. вторая запись ( p->height = 100; ) ведётся по неразрешённой (не выделенной для этих целей) памяти. Если есть желание поэкпериментировать и убедиться в правильности этого
то измени структуру след. образом
Добавлено через 1 минуту и 25 секунд и оставь свой первоначальный код без изменений. результат должен быть примерно как сказал azesmcar -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
||||
|
|||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
jeff, смотри, типичный размер твоей структуры 8 байт. Типичный размер указателя - 4 байта. оператор new выделяет под указатель 4 байта памяти и возвращает адрес начала выделенной области памяти. ты с ними работаешь. Потом ты решил еще выделить память. Так как менеджер памяти считает, что занято только 4 байта, то он выделяет сразу за ними. В итоге, меняя данные в новой выделенной области ты портишь в старой... Но это при такой простой работе менеджера памяти. А теперь представим, что менеджер памяти выделяет какую-то область, в начало ее пишет какие-то служебные данные, а возвращает уже адрес за ними. Таким образом, после второго выделения ты можешь потереть служебные данные. И ошибка возникнет при попытке освобождения памяти или еще одного выделения...
|
|||
|
||||
jeff |
|
|||
Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 24.1.2012 Репутация: нет Всего: нет |
Спасибо всем ответившим, все разъяснили, все понял. С++ коварен, однако
|
|||
|
||||
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 21 Всего: 135 |
![]() Есть простое правило: никогда не используй приведение типов, за исключением: 1) Без этого вообще никак не обойтись 2) Ты на 0x64% знашь, что ты делаешь и как это будет работать -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
![]() ![]() ![]() |
Правила форума "C/C++: Для новичков" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |