Добрый день коллеги.
Есть вот такая замечательная функция (упрощенная для наглядности)
работает как надо, но при больших объемах данных (например есть чертеж с ~8000 линий) , начинает жрать РАМ. причем потом не отпускает эго.
У меня тут косяк какой то или ОС злая и фрагментирует память так что потом отпустить не может?
нашел такую ссылку, нзн связано ли.
https://adndevblog.typepad.com/autocad/2012/07/problem-with-autocads-memory-usage.htmlВозможно функцию можно как то опримизировать чтобы не перебирать всё подряд?
Назначение функции перебрать все пересечения линий, и вставить блок с маской в точке пересечения
inline void addCrossingsAfterExplodeTest(AcDbObjectIdArray modified)
        {
                AcDbObjectIdArray idArray;
 
                for (int i = 0; i < modified.length(); i++)
                {
                        if (getType(modified[i]) != PIPE_TYPE)
                                continue;
                        if (!idArray.contains(modified[i]))
                                idArray.append(modified[i]);
                }
 
                for (int i = 0; i < idArray.length(); i++)
                {
                        for (int j = i; j < idArray.length(); j++)
                        {
 
                                AcGePoint3dArray crossPoints;
                                AcDbObjectId tstId = idArray[j];
                                if (idArray[i] == tstId)
                                        continue;
 
                                AcDbObjectPointer<AcDbLine> lin1(tstId, AcDb::kForRead);
                                AcDbObjectPointer<AcDbLine> lin2(idArray[i], AcDb::kForRead);
                                if (lin1.openStatus() != Acad::eOk || lin2.openStatus() != Acad::eOk)
                                        continue;
 
                                if (lin1->intersectWith(lin2, AcDb::kOnBothOperands, crossPoints) != Acad::eOk)
                                        continue;
 
                                CString lr1 = lin1->layer();
                                CString lr2 = lin2->layer();
 
                                AcGePoint3d l1s = lin1->startPoint();
                                AcGePoint3d l1e = lin1->endPoint();
 
                                AcGePoint3d l2s = lin2->startPoint();
                                AcGePoint3d l2e = lin2->endPoint();
 
                                lin1->close();
                                lin2->close();                  
                        }               
                }
        }
 
пробовал этот код на Autocad 2016 и 2018 64-бит Eng, Win10