CustomEntity. subGetGripPoints. Чистка памяти

Автор Тема: CustomEntity. subGetGripPoints. Чистка памяти  (Прочитано 9297 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

Оффлайн DziubynaАвтор темы

  • ADN Club
  • Сообщений: 41
  • Карма: 4
  • Skype: andriy.dziubyna
Вопрос о чистке памяти.
В своем CustomEntity, для реализации ручек редактирования, я перегрузил методы:
 
Код - C++ [Выбрать]
  1. virtual Acad::ErrorStatus subGetGripPoints (
  2.         AcDbGripDataPtrArray &grips, const double curViewUnitSize, const int gripSize,
  3.         const AcGeVector3d &curViewDir, const int bitflags) const
  4.  
  5. virtual Acad::ErrorStatus subGetGripPointsAtSubentPath(
  6.         const AcDbFullSubentPath & path, AcDbGripDataPtrArray & grips, const double  curViewUnitSize,
  7.         const int  gripSize, const AcGeVector3d & curViewDir, const int  bitflags) const;
  8.  

Ручки редактирования работают корректно для Entity и для всех ее subEntity.

Для каждого AcDbGripData который я забрасываю в AcDbGripDataPtrArray:
Код - C++ [Выбрать]
  1. AcDbGripData* pGripData = new AcDbGripData();
  2. pGripData->setAppData(new CGripData(..., ..., ...));
  3. ....
  4. grips.append(pGripData);

В документации к выше названных методах пишет: "The caller is responsible for freeing the AcDbGripData objects whose pointers are in the grips array".

За очистку "AcDbGripDataPtrArray& grips" я отвечаю? Если так, то в какой момент я должен это делать?
Наверно нужно чистить саму AcDbGripData и мою CGripData.


Смотрел в метод:

Код - C++ [Выбрать]
  1. virtual void subGripStatus(const AcDb::GripStat status);

туда мне приходит :

Код - C++ [Выбрать]
  1. enum GripStat  { kGripsDone = 0, kGripsToBeDeleted   = 1, kDimDataToBeDeleted = 2 };

Но если нужно очищать массив AcDbGripDataPtrArray &grips, то в этот момент я не знаю ничего про него не знаю, в таком случае мне нужно где то в Entity хранить его и формировать еще до вызова getGripPoints.

В сэмплах AutoCAD примеров очистки не нашел.

Также я использую размерные выноски для GripPoint, задаю методами:
Код - C++ [Выбрать]
  1. void setHotGripDimensionFunc(GripDimensionPtr pFunc);
  2. void setHoverDimensionFunc(GripDimensionPtr pFunc);
  3. ----------------------------------------------------------------
  4. typedef void (*GripDimensionPtr)(AcDbGripData* pThis, const AcDbObjectId& entId,
  5.     double dimScale, AcDbDimDataPtrArray& dimData);
  6. ----------------------------------------------------------------

В них по такому же принципу заполняю AcDbDimDataPtrArray& dimData:
Код - C++ [Выбрать]
  1. pDim  = new AcDbDimension();
  2. .....
  3. AcDbDimData* pDimData  = new AcDbDimData(pDim);
  4. pDimData->setAppData(new CDimData(..., ..., ...));
  5. ....
  6. dimData.append(pDimData);

Нужно ли мне потом чистить "AcDbDimDataPtrArray& dimData"?
Вижу, что в деструкторе AcDbDimData удаляется AcDbDimension, но AcDbDimData и CDimData наверно нужно мне удалять отдельно.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: CustomEntity. subGetGripPoints. Чистка памяти
« Ответ #1 : 06-05-2015, 13:59:54 »
За очистку "AcDbGripDataPtrArray& grips" я отвечаю?
Нет. Caller - т.е. тот, кто вызывает эту функцию. А вызывает её AutoCAD.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн DziubynaАвтор темы

  • ADN Club
  • Сообщений: 41
  • Карма: 4
  • Skype: andriy.dziubyna
Re: CustomEntity. subGetGripPoints. Чистка памяти
« Ответ #2 : 06-05-2015, 14:19:57 »
Нет. Caller - т.е. тот, кто вызывает эту функцию. А вызывает её AutoCAD.

На счет этого я так и думал, но AppData которую я задаю AcDbGripData я должен сам чистить (освобождать выделенную память)? Вижу что в классе AcDbGripData деструктор пустой: ~AcDbGripData() {}

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: CustomEntity. subGetGripPoints. Чистка памяти
« Ответ #3 : 06-05-2015, 17:01:19 »
Насколько я помню и здесь ничего самим не нужно чистить. Но на всякий случай проверь вызывается ли у тебя деструктор CDimData не из твоего кода.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Отмечено как Решение Dziubyna 07-05-2015, 11:40:39

Оффлайн DziubynaАвтор темы

  • ADN Club
  • Сообщений: 41
  • Карма: 4
  • Skype: andriy.dziubyna
Re: CustomEntity. subGetGripPoints. Чистка памяти
« Ответ #4 : 07-05-2015, 11:40:36 »
Но на всякий случай проверь вызывается ли у тебя деструктор CDimData не из твоего кода.

Проверил. Не вызивается деструктор ни в CDimData ни в CGripData. То есть AutoCAD не удаляет объекты, которые задаются в setAppData для AcDbGripData, AcDbDimData.

Проблему решил.
Сохраняю AcDbGripDataPtrArray который передаю AutoCAD'у в subGetGripPoints и в subGetGripPointsAtSubentPath.

Потом в методах subGripStatus и subSubentGripStatus удаляю AppData для AcDbDimData когда приходит GripStat::kDimDataToBeDeleted, и AppData для AcDbGripData когда приходить GripStat::kGripsToBeDeleted.
Когда приходит GripStat::kGripsDone очищаю AcDbGripDataPtrArray.

По сколько у меня может быть много SubEntity то храню в таком виде
Код - C++ [Выбрать]
  1. std::map<Adesk::GsMarker, AcDbGripDataPtrArray> EntGripsMap;
Adesk::GsMarker - идентификатор SubEntity для которой были созданы грипы AcDbGripDataPtrArray

Все работает, может кому пригодится.