Russian Qt Forum
Октябрь 04, 2024, 02:21 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Уничтожение объектов  (Прочитано 3848 раз)
FreeSlave
Гость
« : Июль 30, 2011, 17:20 »

Насколько я понимаю, QGraphicsScene сама ответственная за уничтожение объекта, но у меня тут такая тема, в общем сами смотрите:

Код
C++ (Qt)
BattleField::BattleField(QObject *parent) : QGraphicsScene(QRectF(0,0,12*80,12*60), parent)
{
   int x=64;
   int y=64;
   arr = new Hexagon**[rows]; //Указатели на строки указателей
   for (int i=0; i<rows; ++i)
   {
       if(i%2!=0) cols--;
       arr[i] = new Hexagon*[cols]; //Создание строк указателей
       for (int j=0; j<cols; ++j)
       {
           arr[i][j] = new Hexagon; //Создание объекта по каждому указателю
           addItem(arr[i][j]);
           arr[i][j]->setPos(x,y);
           x+=2*len;
       }
       if(i%2!=0) {cols++; x=64;}
       else x=64+len;
       y+=1.5*r;
   }
}
 
BattleField::~BattleField()
{
   for (int i=0; i<rows; i++)
       delete[]arr[i];
   delete[]arr;
}
 

arr - это Hexagon***, в данном случае используется как двумерный массив указателей.
Вопрос: сможет ли сцена удалить объекты по указателям, если я удалю сами указатели?


Хмм, хотя сейчас подумал, при посылке в функцию указатели ведь копируются, т.е. если я удалю первоисточник, указатели на те же объекты всё равно останутся. Но уверенности всё равно не хватает.
« Последнее редактирование: Июль 30, 2011, 19:24 от FreeSlave » Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4744



Просмотр профиля WWW
« Ответ #1 : Июль 30, 2011, 18:42 »

удивительно как у тебя код скомпилировался - выделение памяти совершенно неправильное. я так понимаю у тебя там "строки строк" указателей на Hexagon - Hexagon ***arr.
Код
C++ (Qt)
BattleField::BattleField(QObject *parent) : QGraphicsScene(QRectF(0,0,12*80,12*60), parent)
{
   int x=64;
   int y=64;
   arr = new Hexagon**[rows]; //Указатели на строки указателей
   for (int i=0; i<rows; ++i)
   {
       if(i%2!=0) cols--;
       arr[i] = new Hexagon*[cols]; //Создание строк указателей
       for (int j=0; j<cols; ++j)
       {
           arr[i][j] = new Hexagon; //Создание объекта по каждому указателю
           addItem(arr[i][j]);
           arr[i][j]->setPos(x,y);
           x+=2*len;
       }
       if(i%2!=0) {cols++; x=64;}
       else x=64+len;
       y+=1.5*r;
   }
}
 
BattleField::~BattleField()
{
   for (int i=0; i<rows; i++)
       delete[] arr[i];
   delete[] arr;
}
ещё для простоты можно пользоваться вектором или списком.

а сцена - да, сама поудаляет добавленные на неё объекты.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
FreeSlave
Гость
« Ответ #2 : Июль 30, 2011, 19:19 »

выделение памяти совершенно неправильное.

Что здесь неправильного? Стандартное создание двумерного массива. Только у меня это двумерный массив из указателей, отсюда и ***.

Хмм, а в посте и правда неправильно. Не знаю, как сюда копируется, но в коде всё путём.
А понял, просто [ i ] за тэг посчиталось.
« Последнее редактирование: Июль 30, 2011, 19:21 от FreeSlave » Записан
FreeSlave
Гость
« Ответ #3 : Июль 30, 2011, 19:28 »

Заключил в тэг [ code ], теперь нормально.
« Последнее редактирование: Июль 30, 2011, 19:32 от FreeSlave » Записан
FreeSlave
Гость
« Ответ #4 : Июль 30, 2011, 21:49 »

Скажите, а могу ли я быть уверен, что адреса объектов не изменятся в ходе работы сцены?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Июль 31, 2011, 00:23 »

Две и более звездочек очень затрудняют понимание (в том числе и для пишущего). В таких случая хорошо помогает typedef, напр.

Код
C++ (Qt)
typedef Hexagon * HexPtr;
typedef HexPtr * HexRow;
typedef HexRow * HexArray;
...
arr = new HexRow[rows];
..
arr[i] = new HexPtr[cols];
 
 

И еще: конечно дело Ваше как писать, но сильно "прессовать" текст не стоит напр
Код
C++ (Qt)
       if(i%2!=0) {cols++; x=64;}
       else x=64+len;
 
Лучше написать "поширше" хотя бы так
Код
C++ (Qt)
x = 64;
if (i % 2) ++cols;
else x += len;
 
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #6 : Август 01, 2011, 10:16 »

Цитировать
Вопрос: сможет ли сцена удалить объекты по указателям, если я удалю сами указатели?
Всё делаешь верно. После QGraphicsScene::addItem() элемент становится "собственностью" сцены.
Записан

Qt 5.11/4.8.7 (X11/Win)
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.218 секунд. Запросов: 23.