![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Форумчанин
Регистрация: 09.05.2009
Сообщений: 162
|
![]()
Привет, друзья!!!
В который раз мучаюсь с дилемой о динамическом выделении в конструкторе и уничтожением в деструкторе. вот Код:
Блин, в чем тут дело??
С наилучшими пожеланиями.
Последний раз редактировалось Sazary; 04.09.2009 в 18:20. |
![]() |
![]() |
![]() |
#2 |
Старожил
Регистрация: 22.05.2007
Сообщений: 9,091
|
![]()
1. Раз уж вы работаете с классом, то уберите все члены в private секцию. i и word в public'е делать нечего.
2. В каком-то странном месте класс у вас описан, однако. Может выкинуть его из main? 3. Оператор [] у вас какой-то левый. Существует только this[0], this[1] никогда не было и не может быть. Уберите его вовсе, не нужен он вам. 4. В операторе [] параметр перекрывает член класса. Смотрите не попадите так на грабли, но это на будущее, ибо грабли там в this[i] ![]() 5. В деструкторе i = 0 - бессмысленная операция. 6. "RED" - это const char*, а word - char*. Операция a[0].word="RED"; вообще не должна работать. 7. Раз работаете с сишными строками, то читайте как их правильно копировать. см. функции: strcpy и strdup 8. Класс устроен так, что память будет течь ручьем, так что из деструктора можно смело всё удалить, разница будет не велика. В любом случае память потекёт ![]() |
![]() |
![]() |
![]() |
#3 |
Белик Виталий :)
Старожил
Регистрация: 23.07.2007
Сообщений: 57,097
|
![]()
А у меня вопрос не скромный. А создавать a[0] инструкцией new не нужно?
I'm learning to live...
|
![]() |
![]() |
![]() |
#4 |
Старожил
Регистрация: 22.05.2007
Сообщений: 9,091
|
![]()
Неа. Тут же массив объектов, а не указателей. Для всех элементов данного массива вызовется конструктор по умолчанию.
Массив тут походу вообще для того, чтобы задействовать оператор [], но он всёравно не используется, ибо совершенно другой оператор [] перегружается ![]() |
![]() |
![]() |
![]() |
#5 | |
Белик Виталий :)
Старожил
Регистрация: 23.07.2007
Сообщений: 57,097
|
![]() Цитата:
I'm learning to live...
|
|
![]() |
![]() |
![]() |
#6 |
Пользователь
Регистрация: 15.08.2009
Сообщений: 37
|
![]()
Класс описан как локальный - внутри функции. На такие классы - масса ограничений (я не помню, надо смотреть в стандарте).
Надо вынести класс из функции. |
![]() |
![]() |
![]() |
#7 |
Форумчанин
Регистрация: 09.05.2009
Сообщений: 162
|
![]()
блин, заменил строку а(0).вёрд присвоить... на strcpy(a[0].word,"RED"); и перестало вываливаться)))
Насчет граблей всяческих то я практиковался на этом примере, хотя это уже второй раз я попался на i ))) Вот только где,блин, утечка?
С наилучшими пожеланиями.
|
![]() |
![]() |
![]() |
#8 |
Участник клуба
Регистрация: 15.07.2008
Сообщений: 1,933
|
![]()
утечкой памяти в данном случае являлось присваивание переменной word нового значения, без освобождения участка памяти, на который word указывала до этого.
по поводу strcpy(a[0].word, "RED"); в данном случае так делать не надо)) Если окажется, что память, связанная с word окажется меньше копируемой строки, то вы получите AV, или что-то в этом роде. Вместо этого напишите ф-цию внутри класса, которая бы следила, чтобы память во время освобождалась и выделялась под копируемую строку, например: Код:
![]() Последний раз редактировалось netrino; 04.09.2009 в 17:18. |
![]() |
![]() |
![]() |
#9 |
Старожил
Регистрация: 22.05.2007
Сообщений: 9,091
|
![]()
Нигде не отлавливается изменение строки.
a[0].word = "RED" не копирует строку, а записывает в word новый указатель на строку. Вообще это компилироваться даже не должно по идее, т.к. "RED" - это константная строка. Так вот указатель заменили, а ту память, на которую word до этого указывал, "потеряли" и не очистили. Ну а так вываливает как раз вероятно из-за попытки удалить константную строку. Если не касаться архитектуры класса и что он себя вообще должен представлять в вашей предметной области, я бы переписал его как минимум так: Код:
В моём примере проверяется корректность копирования объектов и работа оператора присваивания. Запускаем мой код и всё работает. Так? Заносим перегрузку оператора присваивания в комментарий и получаем сообщение об ошибке во время исполнения второго теста. В вашем классе оператор не перегружен, потому конструкция вида "a = b" скомпилируется, но приведёт к ошибке работы с памятью, т.к. одну и ту же строку второй раз в деструкторе попытаетесь удалить. Потом комментируем конструктор копии S(S const &obj) и получаем уже ошибку в первом тесте. У вас такого конструктора так же нет, значит конструкции вида "S b(a)" и "S b = a" так же являются опасными. В общем основные ошибки: 1) Строка выставлена наружу и её можно изменять как угодно и это может привести к чему угодно; 2) У вас POD-тип (отсутствуют реализация конструктора копии и перегрузка оператора присваивания), а таковым не может быть из-за наличия указателя. ЗЫ. Не берите данный пример класса как пример для подражания, ибо тут и конструкторы корявенькие и в целом не ахти он, но всёже лучше исходного ![]() |
![]() |
![]() |
![]() |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Найдите ошибку | St1fler92 | Помощь студентам | 4 | 26.05.2009 15:23 |
найдите ошибку | Сова | Паскаль, Turbo Pascal, PascalABC.NET | 9 | 11.02.2009 18:46 |
НАЙДИТЕ ОШИБКУ В ПРОГРАММЕ | svetah | Помощь студентам | 8 | 03.12.2008 15:19 |
Найдите Ошибку. Работа с файлами | Lord_Rufus | Помощь студентам | 2 | 03.10.2008 11:44 |
Найдите ошибку! | geniy | JavaScript, Ajax | 4 | 04.12.2007 16:22 |