Исходя из опыта работы с C #, у меня есть лишь смутное представление об управлении памятью на C ++ - все, что я знаю, это то, что мне придется освобождать память вручную . В результате мой код на C ++ написан таким образом, что объекты типа std :: vector
, std :: list
, std :: map
являются свободно создаются, используются, но не освобождаются.
Я не осознавал этого, пока почти не закончил свои программы, теперь мой код состоит из следующих типов шаблонов:
struct Point_2
{
double x;
double y;
};
struct Point_3
{
double x;
double y;
double z;
};
list<list<Point_2>> Computation::ComputationJob
(list<Point_3>pts3D, vector<Point_2>vectors)
{
map<Point_2, double> pt2DMap=ConstructPointMap(pts3D);
vector<Point_2> vectorList = ConstructVectors(vectors);
list<list<Point_2>> faceList2D=ConstructPoints(vectorList , pt2DMap);
return faceList2D;
}
Мой вопрос: должен ли я освободить every.single.one использования списка (в приведенном выше примере это означает, что мне нужно освободить pt2DMap
, vectorList
и faceList2D
)? Это было бы очень утомительно! Единственная часть, в которой методы различаются, - это запрос, который они запускают в середине моего метода -
def summary = c.list {
eq('browser', Browser.get(1)) // OR eq('os', OS.get(1))
between('date', dates.start, dates.end)
}
Мне пришло в голову, что идеальным способом рефакторинга было бы передать первую строку замыкания в качестве параметра метода. Как и
doStats (Closure query) {
...
def summary = c.list {
query
between('date', dates.start, dates.end)
}
}
, я пробовал это, но "запрос" игнорируется. Вместо этого я попробовал query (), но затем предложение запроса выполняется там, где оно определено, поэтому это тоже не работает. Полагаю, я мог бы просто передать все замыкание в качестве параметра, но это кажется неправильным - запрос может также усложниться в будущем.
У кого-нибудь есть идеи получше?