![]() |
Модераторы: bsa |
![]() ![]() ![]() |
|
marsh123 |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 69 Регистрация: 22.6.2008 Репутация: нет Всего: нет |
Доброй ночи.
Перехожу на C++ с СИ и тут не понимаю одной тонкости. Если по-порядку, то пытаюсь написать класс строк, а затем класс стека на этих строках, всё это нужно сделать без использования STL. Проблема в том, что при запуске возникает аварийный останов, с ошибкой double free or corruption, поставив cout в деструктор, я заметил, что он действительно вызывается больше раз, чем я этого ожидаю. Ниже приведу код, просьба пояснить, в чём косяк и строго не судить, я совершаю плавный переход на плюсы ![]()
|
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
замени все malloc/calloc/free на new/delete и new[]/delete[]. Или вызывай размещающий new и деструктор вручную.
Сейчас ты используешь несконструированные объекты: stack_elem *e = (stack_elem*)malloc(sizeof(stack_elem)); не вызывает конструктор для String. |
|||
|
||||
marsh123 |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 69 Регистрация: 22.6.2008 Репутация: нет Всего: нет |
Можете показать на примере какой-то строчки кода, как осуществлять замену? Я просто думал, что new можно вызывать только для объекта с конструктором, что мне тогда делать, если нужно выделить память под структуру? |
|||
|
||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
Отсуствует copy конструктор, оператор присваивания описан неверно (надо как минимум void operator =(const String& str); )
|
|||
|
||||
marsh123 |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 69 Регистрация: 22.6.2008 Репутация: нет Всего: нет |
Ладно, спасибо, буду вникать в азы С++ более подробно, запасусь книжками
![]() |
|||
|
||||
marsh123 |
|
||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 69 Регистрация: 22.6.2008 Репутация: нет Всего: нет |
Все же спрошу здесь, чтобы до конца разобраться, пока вообще убрал стек, хочу строку по-хорошему дописать, заменил все malloc\free на new\delete, также вообще убрал перегрузку =, так как он, похоже, лишняя, как я понял из литературы, вот такая конструкция:
Будет работать без всяких перегрузок, нужен лишь конструктор класса объекта s1 с аргументом const char*, как я, собственно, и сделал, он даже вызывается на этой строке, но я получаю сегфолт ![]() При этом простые вызовы Add_Symb отлично работают, а если я их циклю в конструкторе, то сегфолт ![]() Укажите, пожалуйста, более подробно на ошибки, буду очень признателен. Собственно код:
|
||||
|
|||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
Вам нужен оператор присваивания (ну и copy конструктор не помешает). На вашей строке s1 = "fdjfdj"; на самом деле происходит следующее (в виде псевдокода, с явными вызовами всех конструкторов и деструкторов):
|
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
marsh123, поменяй size и capacity местами. Обычно, capacity означает общий выделенный объем, а size - занятый.
Размер строки при необходимости увеличить, лучше удваивать.
|
|||
|
||||
marsh123 |
|
||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 69 Регистрация: 22.6.2008 Репутация: нет Всего: нет |
Ниже приведу код, даже конструктор копирования добавил, хотя пока слабо понимаю, зачем он, поэтому, возможно, написал его неправильно.
К коду сопутствующий вопрос, оператор =, по-хорошему, еще должен затирать старую строку, то есть нужно как-то освобождать старую память, по всей видимости delete[] делать, но, что если память уже освобождена и я буду пытаться делать delete[] уже освобожденной памяти, как это проверить ![]()
![]() Это сообщение отредактировал(а) marsh123 - 2.3.2012, 17:38 |
||||
|
|||||
marsh123 |
|
||||||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 69 Регистрация: 22.6.2008 Репутация: нет Всего: нет |
Последний вопрос отменяется, там разобрался, уже дописал стек и он даже работает
![]() Реализовал возможность пушить в стек через =, то есть:
аналогично
Теперь мне нужно сделать, чтобы работало вот так:
Всё это должно быть запушено слева направо. Надо перегрузить запятую (ну и, видимо, равно по-другому как-то перегружать), но идей что-то нет вообще ![]() Может объясните, как в таком случае перегружают, на примере? Заранее спасибо ![]()
|
||||||||
|
|||||||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
marsh123, у тебя size включает завершающий 0 или нет?
|
|||
|
||||
marsh123 |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 69 Регистрация: 22.6.2008 Репутация: нет Всего: нет |
Включает, я добавляю завершающий 0 в конце строки, затем уменьшаю номер последнего символа, чтобы затирать ноль при след добавлении нормального символа, в итоге расширение size произойдет априори. Это сообщение отредактировал(а) marsh123 - 2.3.2012, 23:10 |
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
marsh123, тебе не кажется, что это слишком сложно?
Все делается как-то так:
Кстати, наиболее оптимально вместо size и capacity использовать указатели на конец данных и конец выделенной области соответственно. |
|||
|
||||
marsh123 |
|
||||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 69 Регистрация: 22.6.2008 Репутация: нет Всего: нет |
Да я не спорю, что более оптимально написать можно, тоже сначала также примерно хотел сократить, но решил уже довести до рабочего состояния. А что на счет стека? Там вопрос задавал, как сделать, чтобы:
Где s - объект стека, запушило слева направо эти строчки. |
||||||
|
|||||||
![]() ![]() ![]() |
Правила форума "C/C++: Для новичков" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |