Что я не так делаю с указателями? |
Здравствуйте, гость ( Вход | Регистрация )
Что я не так делаю с указателями? |
Shaitan |
26.8.2015, 19:33
Сообщение
#1
|
Новичок Группа: Новичок Сообщений: 8 Регистрация: 22.7.2015 Пользователь №: 4418 Спасибо сказали: 0 раз(а) Репутация: 0 |
Добрый день.
Решил написать небоьшую программу, которая будет читать данные из тектового файла. Данные представляют собой простой список. Id, Name, Field1,Field2. Для начало создал свою структуру:
После Запускается функция в которую передаю Список обработанных строк. Этот список я разбиваю на группы. Группы разделенв ";". Каждую группу я записываю в промежуточный список.
Этот Список передаю в процедуру создание списка указателей структур. По возвращению из неё пытаюсь очищать промежуточный список. И тут у меня лезут ошибки
Если в фунции не создавать указатель на структуру, то промежуточный список нормально очищается. Что я не так делаю? Заранее спасибо! |
|
|
Trisch |
26.8.2015, 23:29
Сообщение
#2
|
Активный участник Группа: Участник Сообщений: 379 Регистрация: 30.1.2012 Из: Запорожье Пользователь №: 3169 Спасибо сказали: 24 раз(а) Репутация: 0 |
А какие ошибки лезут?
|
|
|
Iron Bug |
27.8.2015, 11:01
Сообщение
#3
|
Профессионал Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: 12 |
ну, при беглом просмотре кода, сразу же в первом блоке:
зачем тут адрес? подумай, что ты удаляешь. вообще, логика кода какая-то странная. ты не проверяешь, что _strList содержит минимум два элемента, хотя обращаешься к ним. потом, вот это условие тоже какое-то малопонятное:
не исключено, что там ещё есть ошибки логические. в общем, внимательнее надо код писать. |
|
|
Shaitan |
27.8.2015, 13:03
Сообщение
#4
|
Новичок Группа: Новичок Сообщений: 8 Регистрация: 22.7.2015 Пользователь №: 4418 Спасибо сказали: 0 раз(а) Репутация: 0 |
ну, при беглом просмотре кода, сразу же в первом блоке: delete &rVar; зачем тут адрес? подумай, что ты удаляешь. вообще, логика кода какая-то странная. ты не проверяешь, что _strList содержит минимум два элемента, хотя обращаешься к ним. потом, вот это условие тоже какое-то малопонятное: leght = _strList.length() - i; while(leght >= i ... Насчёт delete &rVar; Это я пытаюсь очистить память от указателей. Согласен нужно это сделать иначе. Вторая странность это я узнаю длину списка и перебираю его до того пока не упрусь в ";" А какие ошибки лезут? Я вечером опишу подробнее. Постараюсь со скриншотами. Если очень кратко. Я создаю список структур, а после я этот список очищаю и высвобождаю память под структурами. |
|
|
Iron Bug |
27.8.2015, 15:32
Сообщение
#5
|
Профессионал Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: 12 |
Насчёт delete &rVar; Это я пытаюсь очистить память от указателей. Согласен нужно это сделать иначе. это выражение просто вообще смысла не имеет, причём в любом контексте. и оно всегда будет вызывать сбой в памяти. Вторая странность это я узнаю длину списка и перебираю его до того пока не упрусь в ";" нет. до конца это списка это никогда не дойдёт, потому что условие leght >= i его выкинет ровно посередине. простая система уравнений Цитата leght = _strList.length() - i; leght = i; даёт Цитата i = _strList.length()/2; так что с логикой тут серьёзные проблемы. |
|
|
Shaitan |
27.8.2015, 16:48
Сообщение
#6
|
Новичок Группа: Новичок Сообщений: 8 Регистрация: 22.7.2015 Пользователь №: 4418 Спасибо сказали: 0 раз(а) Репутация: 0 |
Цитата(Shaitan @ 27.8.2015, 15:03) * Вторая странность это я узнаю длину списка и перебираю его до того пока не упрусь в ";" нет. до конца это списка это никогда не дойдёт, потому что условие leght >= i его выкинет ровно посередине. простая система уравнений Цитата leght = _strList.length() - i; leght = i; даёт Цитата i = _strList.length()/2; так что с логикой тут серьёзные проблемы. Чёрт. тут опечатка у меня. Должно быть: leght = _strList.length() - 1; так как масив от нуля считается, потому и минус 1. Спасибо за ошибку. Вечером постараюсь пересмотреть код. Вопрос. Очистку списка структур я правильно делаю? |
|
|
Shaitan |
27.8.2015, 19:52
Сообщение
#7
|
Новичок Группа: Новичок Сообщений: 8 Регистрация: 22.7.2015 Пользователь №: 4418 Спасибо сказали: 0 раз(а) Репутация: 0 |
А какие ошибки лезут? После того отработала моя функция runLineCode, я очищая промежуточный список:
на строке strListLine.clear(); мой код выкидывает в qarraydata.h
на строку QArrayData::deallocate(data, sizeof(T), Q_ALIGNOF(AlignmentDummy)); Странно почему тут ошибка. Вот исправленная функция после Ваших замечаний:
|
|
|
Shaitan |
27.8.2015, 21:04
Сообщение
#8
|
Новичок Группа: Новичок Сообщений: 8 Регистрация: 22.7.2015 Пользователь №: 4418 Спасибо сказали: 0 раз(а) Репутация: 0 |
Причину нашёл. Я не инициализировал указатель на структкру.
var = new RVariable(); Проблема решена. Всем спасибо! |
|
|
Iron Bug |
28.8.2015, 10:36
Сообщение
#9
|
Профессионал Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: 12 |
Спасибо за ошибку. да не за что. это твоя ошибка, ты её сам сделал код надо писать внимательно. если опыта нет, то тем более не нужно торопиться. например, ты уверен, что это условие написано правильно?
|
|
|
Shaitan |
28.8.2015, 19:39
Сообщение
#10
|
Новичок Группа: Новичок Сообщений: 8 Регистрация: 22.7.2015 Пользователь №: 4418 Спасибо сказали: 0 раз(а) Репутация: 0 |
|
|
|
Текстовая версия | Сейчас: 4.12.2024, 22:47 |