![]() |
Модераторы: bsa |
![]() ![]() ![]() |
|
nibble |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 14.3.2009 Где: Москва Репутация: нет Всего: нет |
words - массив указателей на строки, я правильно выражаюсь? Точнее даже указатель на такой массив, да? И newWords - тоже точно такой же указатель на массив указателей... Я пишу "words = newWords;". Мне нужно, чтобы указатель words ссылался не на начальный массив, а на новый, где слов стало 4, а не 3. В чем ошибка?.. Это сообщение отредактировал(а) nibble - 14.3.2009, 14:52 |
|||
|
||||
Rififi |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1254 Регистрация: 9.3.2008 Репутация: 3 Всего: 36 |
nibble,
words - массив указателей на строки, я правильно выражаюсь? Точнее даже указатель на такой массив, да? нет. word - это массив константных указателей на char. а вот newWords - это действительно указатель. ты думаешь что это одно и тоже, и пытаешься убедить в этом компилятор - отсюда и ошибка. |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
не получится, так как первоначальный массив статический и изменению размера не подлежит. (Неправилен сам замысел, не говоря о путанице массивов и указателей) Это сообщение отредактировал(а) mes - 14.3.2009, 15:09 |
|||
|
||||
nibble |
|
||||
![]() Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 14.3.2009 Где: Москва Репутация: нет Всего: нет |
Теперь верно? Я создаю указатель words. Сначала он указывал на массив указателей на две строки, потом на три. Добавлено @ 15:52
Строками "delete words;" и "delete NewWords;" дейсвительно удаляются старые массивы указателей? Память освобождается? Или он удаляет пустоту? Ни как не разобраться в этих звёздочках... Ведь когда я пишу "delete words;", должен удаляться массив OldWords, ведь words ссылается на него. А после "delete NewWords;" удалится массив NewWords? Выходит, всё удалится... почему тогда слова нормально выводятся на экран?.. Это сообщение отредактировал(а) nibble - 14.3.2009, 15:56 |
||||
|
|||||
zim22 |
|
|||
![]() depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 29 Всего: 69 |
||||
|
||||
Rififi |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1254 Регистрация: 9.3.2008 Репутация: 3 Всего: 36 |
nibble,
Строками "delete words;" и "delete NewWords;" дейсвительно удаляются старые массивы указателей? В этих строках происходит undefined behavior из за неправильной последовательности неправильных действий правильная последовательность правильных действий
|
|||
|
||||
nibble |
|
||||
![]() Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 14.3.2009 Где: Москва Репутация: нет Всего: нет |
Можно обойтись и без OldWords:
Почему нелья "delete [] NewWords;" до вывода на экран? В отладчике вообще не видно никакой реакции на "delete [] words;" и "delete [] NewWords;". Он не удаляет временный массив указателей NewWords. А мне нужно, чтобы удалял... |
||||
|
|||||
zim22 |
|
|||
![]() depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 29 Всего: 69 |
а какую реакцию ты ждёшь увидеть? Добавлено через 1 минуту и 3 секунды потому что это:
|
|||
|
||||
nibble |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 14.3.2009 Где: Москва Репутация: нет Всего: нет |
То есть реакции не должно быть? Он сотрёт ячейки памяти только когда они ему понадобятся?
И именно по этому всё выводится на экран, несмотря на "delete [] NewWords;" в неположенном месте?.. Выходит, words и NewWords становятся указателями на один и тот же объект. И "delete [] NewWords;" - это то же самое, что и "delete [] words;". Я правильно понимаю? |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
||||
|
||||
zim22 |
|
|||
![]() depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 29 Всего: 69 |
у меня ничего не выводится на экран. как оно может выводиться, когда мы удалили указатели? и кстати, words[3] нет такого элемента. попробуй этот код. он тоже у тебя корректно работает?
|
|||
|
||||
nibble |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 14.3.2009 Где: Москва Репутация: нет Всего: нет |
Работает. Точно также, как и мой.
Выводит "Sister, Brother, Mother, Current language: auto; currently c++" "Current language: auto; currently c++" - это из-за отсутсвия words[3] он случайно попадает на эту строку, я так понимаю. Как он может работать, если мы всё поудаляли?.. Если нет ни NewWords, ни words?.. |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
Упрощено: Вы удалили объект, и oн освободил занимаемую память. содержимое памяти не изменилось и не изменится пока эта область не будет захвачена другим объектом ![]() Это сообщение отредактировал(а) mes - 14.3.2009, 17:34 |
|||
|
||||
math64 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 12 Всего: 72 |
1. В данном случае delete words; и delete[] words; - одно и то же, отличие было бы только если бы words был бы массивом объектов-классов с деструктором. В первом случае вызвался бы деструктор только для первого объекта, во втором - для всех.
2. char* words[] = { "Apple", "Mother", "New York"}; - массив указателей, где вы видите const? *words[0] = 'U'; выполнить нельзя, но компилятор этого не заметит. Во время выполнения в Linux будет ошибка записи в память, доступной только для чтения, в DOS выполнится нормально. |
|||
|
||||
![]() ![]() ![]() |
Правила форума "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. |