Тема: Как корректно освобождать 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 (применительно к написанию производных классов). В русскоязычной части я вообще ничего не нашёл по этому поводу.
Пожалуйста, подскажите, как корректно освободить объект?
Спасибо.