Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.08.2009, 19:59   #1
jojahti
Подтвердите свой е-майл
 
Регистрация: 27.07.2009
Сообщений: 437
Злость Ссылочные массивы и сегментатион фаулт.

P.S. Вроде вопрос не столько по QT, сколько общий.

Вообщем для манипулирования объектами сцены я создал ссылочный массив QGraphicsItem * s[15][25] куда кидаю адреса элементов сцены.

Всё работает нормально.
Но при удалении самих элементов, на которые ссылается массив - всё больше увеличивается вероятность сегментатион фаулта.
(повторных обращений к удалённым элементам не происходит)

Присваивал я таким образом:
QGraphicsItem *item;
s[y][x] = item;
jojahti вне форума Ответить с цитированием
Старый 26.08.2009, 20:32   #2
jojahti
Подтвердите свой е-майл
 
Регистрация: 27.07.2009
Сообщений: 437
По умолчанию

Нет, это не с этим связано.
jojahti вне форума Ответить с цитированием
Старый 27.08.2009, 08:53   #3
lennon
Заблокирован
 
Регистрация: 18.11.2007
Сообщений: 254
По умолчанию

так такого вида массивы должны размещаться в стеке, а ты их ешо удаляешь, стек будет нарушен и в каком месте может вылетить. не удаляй их из памяти, сами удаляться! только динамический массив программист очищает сам
lennon вне форума Ответить с цитированием
Старый 27.08.2009, 09:34   #4
jojahti
Подтвердите свой е-майл
 
Регистрация: 27.07.2009
Сообщений: 437
По умолчанию

lennon
Там ничего не нарушено, ведь в массиве только адреса на элементы.
В чём хранятся элементы, я не знаю - сиё покрыто тайной. Но удаляю я их средствами сцены потому всё ништяк.

Проблема в операции +=. Она иногда не работает. )))

P.S. Не допёр, почему такие массивы должны находиться в стэке?
jojahti вне форума Ответить с цитированием
Старый 27.08.2009, 10:13   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
Но удаляю я их средствами сцены потому всё ништяк.
Ну и соответственно обнуляй соответствующую ячейку массива в nil
[QUOTE]Не допёр, почему такие массивы должны находиться в стэке?[QUOTE]
Наверное Леннон имел ввиду что ты эти массивы как локальные обьявляешь.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 27.08.2009, 10:16   #6
jojahti
Подтвердите свой е-майл
 
Регистрация: 27.07.2009
Сообщений: 437
По умолчанию

Stilet
Цитата:
Ну и соответственно обнуляй соответствующую ячейку массива в nil
А если повторных обращений не бывает, то по логике это излишне?
jojahti вне форума Ответить с цитированием
Старый 27.08.2009, 10:30   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
то по логике это излишне?
Ну для надежности это необходимо. Если так рассуждать то тогда зачем вообще все удалять, какая разница пусть мусор остается в памяти, все равно на прогу не влияет.
Не. Наксерачил - убери.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 27.08.2009, 10:47   #8
jojahti
Подтвердите свой е-майл
 
Регистрация: 27.07.2009
Сообщений: 437
По умолчанию

Stilet
int f[2][2] = nil. Уберёт из массива ссылку?
jojahti вне форума Ответить с цитированием
Старый 27.08.2009, 10:56   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Ну разве что
f[2][2] = NULL лучше.
А потом проверки на NULL естественно.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 27.08.2009, 11:25   #10
lennon
Заблокирован
 
Регистрация: 18.11.2007
Сообщений: 254
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
НЕсли так рассуждать то тогда зачем вообще все удалять, какая разница пусть мусор остается в памяти, все равно на прогу не влияет.
это не грамотно.

и вообще разве память выделиться в куче при таком объявлении QGraphicsItem * s[15][25]? даже если тут и стоит указатель то это значит только то, что в стеке будет находиться 15*25 этих самих адрессов, которые нужно инициализоровать в куче. место для них выделиться в стеке, а стек сам очищаеться, его НЕЛЬЗЯ ТРОГАТЬ!!!

а стоп... я туплю... автор же удаляет сами указатели из массива. а зачем ты их удаляешь? когда класс выходит из области видимости он сам вызыват деструктор, его нежно удалять. темб олее ты незнаешь как работает этот класс, может нельзя его блин удалять!!! место выделеное под него совободиться само. обычно в классах есть функция которая его удалит из памяти, толи drop толи free толи release.

Цитата:
Сообщение от Stilet Посмотреть сообщение
Ну разве что
f[2][2] = NULL лучше.
А потом проверки на NULL естественно.
а разве память очиститься если присвоить укзателю нулевой адресс? я могу сказать что нет

Последний раз редактировалось lennon; 27.08.2009 в 11:32.
lennon вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ссылочные типы senchakv Паскаль, Turbo Pascal, PascalABC.NET 0 13.06.2009 21:50
Ссылочные типы senchakv Помощь студентам 0 13.06.2009 21:41
встроеннные функции, ссылочные переменные Dimarik Общие вопросы C/C++ 8 10.05.2009 11:46
Исправте программу.Ссылочные типы данных. Динамическая память ромка) Паскаль, Turbo Pascal, PascalABC.NET 2 30.05.2008 04:24
Ссылочные типы данных. Динамическая память/HELP!! ромка) Паскаль, Turbo Pascal, PascalABC.NET 2 22.05.2008 09:03