18 / 1 / 0
Регистрация: 30.03.2023
Сообщений: 29
|
||||||
1 | ||||||
ООП. Возникает ошибка с динамической памятью11.04.2023, 00:36. Показов 2081. Ответов 49
/*Доброй ночи! Возникает ошибка с памятью в деструкторе класса Person (для двух других классов все срабатывает хорошо). Такое ощущение, что уже происходило освобождение памяти для переменных класса Person (FIO и Birthday), и она пытается освободить память по старому адресу, которого уже нет. */
0
|
11.04.2023, 00:36 | |
Ответы с готовыми решениями:
49
Ошибка с динамической памятью Почему у меня возникает ошибка с памятью (sigsegv)? Ошибка в коде при работе с динамической памятью Работа с динамической памятью через указатели. Загадочная ошибка. Работа с динамической памятью через указатели. Загадочная ошибка. |
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
|
|
11.04.2023, 11:48 | 21 |
Там проблема в целом не в самой проверке, а том для чего эта проверка вызвана. У вас конструктор, указатель FIO только-только "народился" и значения у него еще никакого нет - мусор. А вы его проверять.
0
|
18 / 1 / 0
Регистрация: 30.03.2023
Сообщений: 29
|
|
11.04.2023, 11:49 [ТС] | 22 |
Я стараюсь дополнительно что-то проходить, смотрю тот же SimpleCode на ютубе и selfedu. Но увы, со временем тоже напряг и прохожу ровно столько, сколько мы проходим в учебной организации, т.е. параллельно. Естественно, я понимаю, что на учебе мне всего не дадут и очень много мне нужно будет разбираться самому. Кстати, кто думал иначе (что им в голову все будут вдалбливать, а сами они ничего искать и добывать не будут), те бросили занятия.
0
|
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
|
|
11.04.2023, 11:58 | 23 |
Страуструп, если "Язык программирования С++", то рано.
Если "Принципы и практика", то в самый раз, но в паре с другой книгой, например Прата или Липпмана. Эти книги не взаимозаменяемые, "Принципы и практика" Страуструпа учат "как", а Липпман и Прата "что". Добавлено через 6 минут Это не та copy (это самописная copy), для внутренних нужд класса, чтобы не писать много раз одни и те же действия. Такой принцип, знаете? Это вот самый примитивный пример этого принципа.
1
|
18 / 1 / 0
Регистрация: 30.03.2023
Сообщений: 29
|
|
11.04.2023, 12:05 [ТС] | 24 |
Читал где-то про этот метод, как раз в сортировках.
Но... из вашего того кода я мало, что понял... Буду разбираться сначала с ошибками изначального кода, на которые вы указали. Спасибо!
0
|
3719 / 2648 / 761
Регистрация: 29.06.2020
Сообщений: 9,800
|
||||||
11.04.2023, 15:01 | 25 | |||||
Чем больше проверок, тем медленнее
Вчера написал для Person. Код написан что бы работал, ни на что не претендует, ничего сложного не использовал. С небольшим тестом работоспособности.
Конечно небезопасный совсем ) Добавлено через 42 секунды Впрочем как и все остальное, с таким подходом.
0
|
Модератор
|
|
11.04.2023, 16:55 | 26 |
Зачастую, видосы на ютубе - гораздо менее предпочтительный вариант, по сравнению с книгами и статьями. Особенно с книгами и статьями таких авторов, как Герб Саттер, Николаи Йосуттис, Скотт Мейерс, Стенли Липпман, Бьярне Страуструп, Андрей Александреску, Стивен Дьюхерст, Дэвид Вандевурд и им подобные - люди, у которых в портфолио не один десяток лет профессионального программирования, участие в комитете по стандартизации, выступления на CppCon и т. п.
К тому же, выбирая ресурс, на который Вы опираетесь в обучении, имеет смысл задуматься о качестве материала, подачи, компетенции автора и тому подобных вещах. Обычный мамкин ютубер - это просто чел с улицы, который вчера купил себе вебку и посмотрел пару туториалов, как снимать видосы для ютуба. В то время как книга - это целая индустрия - там и компетенция автора, и ревьюеры, редакторы, которые вычитывают книгу, издательство и так далее. А особенно, когда книга от именитого автора, которая выдержала ни одно издание. Тут сразу ясно, что и глубина познаний автора заслуживают доверия, и качество материала, и так далее. Поэтому, на мой взгляд, лучший способ учиться для начинающего - читать книги, выполнять упражнения из них. Когда поднатореете, хороший вариант - помогать новичками на форуме, читать/писать код. Когда почувствуете себя ещё более уверенно, начинайте контрибьютить в open-source проекты. В качестве итоговой проверки своих навыков попробуйте свои силы в реальной ай-ти компании в качестве разработчика.
0
|
18 / 1 / 0
Регистрация: 30.03.2023
Сообщений: 29
|
|
12.04.2023, 00:53 [ТС] | 27 |
Вы имеете ввиду, что инициализация д.б. в том же порядке, что и порядок объявления переменных в классе? Это обязательно?
Добавлено через 38 секунд Спасибо большое за потраченное время. Обязательно посмотрю Добавлено через 4 минуты Согласен, но на том же SimpleCode - свыше 300К подписчиков, а для айтишного канала (именно обучающего) это очень много, и своего рода признание. Начал читать Страуструпа, позже мельком просмотрел Герба Сеттера - Стандарты программирования (показалась даже интереснее, особенно оглавление - напр. "Почему стоит часто употреблять const" или почему стоит избегать макросов. Спасибо! Добавлено через 7 минут Можете пояснить, почему именно так и чем грозит использование неконст? Спасибо Добавлено через 7 минут А как насчет проверки на то, что память выделилась? if (!FIO || !Birthday) return; Теоретически, она же могла не выделиться, и тогда смысл в дальнейших действиях? Или тоже бесполезная проверка?
0
|
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
|
|
12.04.2023, 00:55 | 28 |
В вашем случае - да, потому что у вас зависимость от этого порядка задана.
А инициализация будет в том порядке, в котором указаны поля, независимо от того, как вы их написали в списке инициализации. Поэтому ваш код содержит ошибку из-за того, что вы надеетесь на то, что прядок будет иным. Добавлено через 1 минуту Перечитайте внимательно все, что я писал выше:
0
|
18 / 1 / 0
Регистрация: 30.03.2023
Сообщений: 29
|
|
12.04.2023, 00:59 [ТС] | 29 |
RAII пока не проходили. Хотелось бы научиться именно ручному контролю
Добавлено через 3 минуты А, т.е. если память в каком-то случае не выделилась, я поймаю исключение и без проверок? Понял
0
|
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
|
|
12.04.2023, 01:04 | 30 |
Знаете, я бы сказал, что это вредительство. Потому что это центральная идиома, вокруг которой строится вообще все современное программирование на С++. Без шуток и преувеличений. Понимаете?
Добавлено через 2 минуты Да, в вызывающем коде поймаете. Главная мысль: конструктор должен либо полностью завершить создание объекта, либо не создавать его вовсе (выйти с исключением). Практика (как у вас было) незавершать создание объекта в конструкторе в случае ошибки и выходить из него штатно, оставляя объект в недосозданном состоянии, очень плохая.
0
|
18 / 1 / 0
Регистрация: 30.03.2023
Сообщений: 29
|
|
12.04.2023, 01:12 [ТС] | 31 |
Почему компилятор мне так не дает написать? Говорит, что swap не является членом класса Person
0
|
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
|
|
12.04.2023, 01:15 | 32 |
0
|
18 / 1 / 0
Регистрация: 30.03.2023
Сообщений: 29
|
|
12.04.2023, 01:17 [ТС] | 33 |
Не понимаю, но верю вам. Я не удивлюсь, если мы этот RAII и не будем проходить. Нам сказали, что осталось 4 мес. обучения С++. А проучились полгода, и вот уровень. И я далеко не худший студент ) Добавлено через 1 минуту Даже стандартные ф-ции необходимо добавлять в сам класс, чтобы с ними в нем можно было работать? )
0
|
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
|
|
12.04.2023, 01:21 | 34 |
Где же они стандартные, если это семантика класса, которую я сам ввел для удобства?
Добавлено через 36 секунд У меня же там в коде все написано. Посмотрите еще раз.
0
|
18 / 1 / 0
Регистрация: 30.03.2023
Сообщений: 29
|
|
12.04.2023, 01:33 [ТС] | 35 |
Нашел ) Я просто начал с самого начала, и иду построчно сверху вниз, а она у вас внизу реализована ) Спасибо!
А почему оператор перемещения мой приводит к утечке памяти? Добавлено через 5 минут Нас так ругают делать (называть одним именем), говорят не безопасно ))
0
|
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
|
|
12.04.2023, 01:37 | 36 |
У этого приема есть название. Идиома copy-and-swap.
Вот ваш код: Он не обменивает местами состояния объектов *this и an , вместо этого принудительно задает null для состояния an .Если у вас в *this уже была выделена какая-то память, то вы указатели на нее перезапишете значениями из an , а в an оставите null`ы. Т.к. указатели вы перетерли, то освободить эту память теперь никак нельзя = утечка. Если бы вы сделали обмен местами, как я показывал, или другим способом, то памятью, которая у вас была в *this , стал бы заведовать объект an , что избавило бы вас от утечки.Добавлено через 1 минуту Ну сделайте другое имя. Это вот здесь вообще не важно.
0
|
18 / 1 / 0
Регистрация: 30.03.2023
Сообщений: 29
|
|
12.04.2023, 01:49 [ТС] | 37 |
А можете объяснить, что мы здесь делаем?
И чем от этого отличается? Ну то есть вторая вроде понятно, мы в операторе меняем значения переменных нашего класса на значения переменных экземпляра класса, который передается параметром. А первая не понятно. Сначала вызывается конструктор копирования а потом меняются значения? Добавлено через 1 минуту Вы предвидели мой вопрос?) Добавлено через 2 минуты Может быть из-за этого и был весь сыр бор. Сейчас попробую, как вы сказали и вуаля Добавлено через 4 минуты Ну да, тут получается даже проверка (if (!human)) не к месту, толку от нее. Кажется начинаю понимать
0
|
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
|
|
12.04.2023, 01:54 | 38 |
Могу, но это также хорошо объяснено по ссылке, которую я дал выше. Прочитайте сначала там, а я подключусь, только если все равно будут затруднения.
Тем, что так не будет работать. an - это константа здесь. И обменивать надо с копией, а не с исходным значением. Добавлено через 2 минуты Сыр-бор был и-за ненужного delete внутри конструктора, который пытался освободить несуществующую память. А проверка, которая как бы должна была от этого защищать, не срабатывала, потому что фактически проверяла "мусор". Вот это место:
0
|
18 / 1 / 0
Регистрация: 30.03.2023
Сообщений: 29
|
|
12.04.2023, 01:58 [ТС] | 39 |
Хотелось бы по поводу этого еще задать вопрос, последний сегодня ) А в чем отличие вашего от моего? Полагаю тоже, не меняются значение и может утечка произойти? Добавлено через 2 минуты "НННННННННННННННННННННННннн" ? Типа что-то есть, поэтому и не срабатывала?
0
|
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
|
|
12.04.2023, 02:01 | 40 |
Prang, по сути - ничем. этот конструктор у вас был правильный, но я просто привёл к единому стилю.
0
|
12.04.2023, 02:01 | |
12.04.2023, 02:01 | |
Помогаю со студенческими работами здесь
40
После выполнения программы, работающей с динамической памятью, вылетает ошибка Работа с динамической памятью. Ошибка в функции getline через посимвольный ввод Ошибка при работе с динамической памятью - 'Invalid pointer operatoion' Файл: при работе с динамической памятью возникает ошибка: "Cannot find bounds of current function" Почему возникает ерунда с памятью? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи | |||||
Как работать с ветками (branch) в Git
InfoMaster 17.01.2025
Система контроля версий Git произвела революцию в процессе разработки программного обеспечения, предоставив разработчикам мощный инструмент для управления изменениями в коде. Одной из наиболее важных. . .
|
Как откатить последние коммиты в Git
InfoMaster 17.01.2025
Система контроля версий Git стала неотъемлемой частью современной разработки программного обеспечения, предоставляя разработчикам мощные инструменты для управления изменениями в коде. Одним из. . .
|
Что такое boilerplate и scaffold, чем они отличаются
InfoMaster 17.01.2025
В современном мире разработки программного обеспечения эффективность и скорость создания качественного кода играют crucial роль в успехе проектов. Разработчики постоянно ищут способы оптимизировать. . .
|
Чем отличаются ссылки и указатели в С++
InfoMaster 17.01.2025
В современном программировании на C++ эффективная работа с памятью является ключевым аспектом разработки качественного программного обеспечения. Указатели и ссылки представляют собой два. . .
|
В чем разница между PUT и POST
InfoMaster 17.01.2025
В современной веб-разработке правильное использование HTTP-методов играет ключевую роль в создании надежных и эффективных API-интерфейсов. Протокол HTTP прошел долгий путь развития с момента своего. . .
|
DTO, POCO и Value Object: что это такое, когда и как использовать
InfoMaster 17.01.2025
Введение в паттерны передачи данных
В современной разработке программного обеспечения эффективное управление данными и их передача между различными слоями приложения являются ключевыми аспектами. . .
|
Что такое pull request в Git
InfoMaster 17.01.2025
В современной разработке программного обеспечения pull request в Git представляет собой ключевой механизм для эффективного взаимодействия между разработчиками при работе над общим кодом проекта. По. . .
|
Как вернуться к предыдущему коммиту в Git
InfoMaster 17.01.2025
Система контроля версий Git представляет собой мощный инструмент для управления изменениями в программном коде, который позволяет разработчикам эффективно отслеживать и контролировать историю. . .
|
Что такое паттерны программирования и проектирования
InfoMaster 17.01.2025
Роль паттернов в современной разработке программного обеспечения
В современном мире разработки программного обеспечения паттерны проектирования стали неотъемлемой частью профессионального подхода. . .
|
Как добавить конструктор Яндекс Карт на сайт
InfoMaster 17.01.2025
Введение в API Яндекс Карт
В современной веб-разработке интеграция картографических сервисов стала неотъемлемой частью многих проектов. API Яндекс Карт представляет собой мощный инструмент для. . .
|
Что такое javascript:void(0) и зачем это нужно
InfoMaster 17.01.2025
Когда вы сталкиваетесь с веб-разработкой, особенно с использованием JavaScript, одной из директив, которая часто встречается, является javascript:void(0). Это выражение вызывает интерес из-за своей. . .
|
Что такое оркестрация и хореография микросервисов
InfoMaster 17.01.2025
Введение в оркестрацию и хореографию микросервисов
В современном мире разработки программного обеспечения микросервисная архитектура стала ключевым подходом к созданию масштабируемых и гибких. . .
|