Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: FreeSlave от Июль 30, 2011, 17:20



Название: Уничтожение объектов
Отправлено: 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***, в данном случае используется как двумерный массив указателей.
Вопрос: сможет ли сцена удалить объекты по указателям, если я удалю сами указатели?


Хмм, хотя сейчас подумал, при посылке в функцию указатели ведь копируются, т.е. если я удалю первоисточник, указатели на те же объекты всё равно останутся. Но уверенности всё равно не хватает.


Название: Re: Уничтожение объектов
Отправлено: kambala от Июль 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;
}
ещё для простоты можно пользоваться вектором или списком.

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


Название: Re: Уничтожение объектов
Отправлено: FreeSlave от Июль 30, 2011, 19:19
выделение памяти совершенно неправильное.

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

Хмм, а в посте и правда неправильно. Не знаю, как сюда копируется, но в коде всё путём.
А понял, просто [ i ] за тэг посчиталось.


Название: Re: Уничтожение объектов
Отправлено: FreeSlave от Июль 30, 2011, 19:28
Заключил в тэг [ code ], теперь нормально.


Название: Re: Уничтожение объектов
Отправлено: FreeSlave от Июль 30, 2011, 21:49
Скажите, а могу ли я быть уверен, что адреса объектов не изменятся в ходе работы сцены?


Название: Re: Уничтожение объектов
Отправлено: Igors от Июль 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;
 


Название: Re: Уничтожение объектов
Отправлено: GreatSnake от Август 01, 2011, 10:16
Цитировать
Вопрос: сможет ли сцена удалить объекты по указателям, если я удалю сами указатели?
Всё делаешь верно. После QGraphicsScene::addItem() элемент становится "собственностью" сцены.