Тема: Как корректно освобождать AcGeEntity*?

Здравствуйте.

При использовании функций, подобных AcGeEntity3d::copy() или AcDbCurve::getAcGeCurve(), освобождение полученного объекта является обязанностью вызывающей стороны. Например, справка по первой из этих функций прямо говорит:

This copy is created using the new and it is the responsibility of the caller to delete it

Справка по второй удивительно лаконична:

This is getAcGeCurve, a member of class AcDbCurve.

Тем не менее, заголовочный файл dbcurve.h сообщает больше:

    /// <summary>
    /// This function returns an AcGeCurve3d that is geometrically identical to
    /// this AcDbCurve.
    /// </summary>
    /// <param name="pGeCurve">Output pointer to an AcGeCurve3d object that is
    /// geometrically identical to this AcDbCurve.  The caller of this function
    /// is responsible for deleting this AcGeCurve3d object.</param>
    /// <param name="tol">Optional input tolerance.</param>
    /// <returns>Returns eOk if successful.</returns>

В первом случае метод создания указан явно, во втором нет, но в обоих случаях используется слово delete. Кроме того, использование delete согласуется с общим трендом ObjectARX, когда во всех случаях рекомендуется использовать new/delete вместо malloc/free. Однако при попытке освобождения указателя при помощи этого оператора AutoCAD рушится.
Функция free, так же как и acad_free (по-видимому, простая обёртка стандартной функции), спокойно проглатывают указатель, но не освобождают его (да, я что-то слышал о существовании деструкторов и их отношениях с delete, но уже приходится пробовать всё подряд). Это можно проверить, вызывая в цикле getAcGeCurve/free. Память не высвобождается, происходит утечка памяти.

В англоязычных Интернетах есть только упоминания о неясности с реализацией getAcGeCurve (применительно к написанию производных классов). В русскоязычной части я вообще ничего не нашёл по этому поводу.

Пожалуйста, подскажите, как корректно освободить объект?

Спасибо.

Re: Как корректно освобождать AcGeEntity*?

По логике уничтожение должно происходить при помощи delete. Возможно это баг, возможно ошибка в документации. Я могу уточнить это в Autodesk, но для этой цели ты должен задать этот вопрос здесь: http://adn-cis.org/forum/index.php?board=3.0
Кроме того создай минимальный проект в котором используются AcGeEntity3d::copy() или AcDbCurve::getAcGeCurve(), укажи версию ObjectARX и AutoCAD.
Если сделаешь как я сказал, то ответ будет.

Re: Как корректно освобождать AcGeEntity*?

Александр, спасибо за ответ.

В процессе подготовки минимального проекта я обнаружил, что в чистом проекте delete отрабатывает без проблем. Но если в include'ах добавить некоторые библиотеки из C++ STL (в частности, <list>) - причём даже не нужно ничего оттуда использовать, просто упомянуть в начале stdafx.h, - возникает краш.

Как-то это всё завязано на версии библиотек, порядок include'ов и порядок следования путей поиска заголовочных файлов, но я ещё не до конца разобрался. Поэтому пока не буду писать в указанный Вами форум.

Страньше всего, что остальные объекты превосходно делетятся при любых условиях...

В любом случае, спасибо, что толкнули в нужном направлении! :)

(изменено: Александр Ривилис, 29 января 2014г. 14:40:14)

Re: Как корректно освобождать AcGeEntity*?

1. Версия ObjectARX?
2. Версия Visual Studio?
3. Какой Platform Toolset установлен?

Ситуация очень похожа на эту: http://adn-cis.org/forum/index.php?topic=467.0

(изменено: Михаил Каганский, 29 января 2014г. 17:44:21)

Re: Как корректно освобождать AcGeEntity*?

1. Версия ObjectARX - 2014
2. Версия Visual Studio - 2013 Express
3. Какой Platform Toolset установлен - правильный :) Microsoft Windows SDK v7.1 (msvcr100).

Всё же вполне возможно, что что-то в моём случае берёт не те библиотеки. Нужно будет включить подробные сообщения линкера.

Re: Как корректно освобождать AcGeEntity*?

Александр Ривилис пишет:

2. Версия Visual Studio - 2013 Express

А! Так это в продолжение этой темы: https://www.caduser.ru/forum/post282166.html#p282166 Ну-ну! ;)