Сейчас я работаю над проектом, который реализует quadTree, на самом деле это всего лишь визуализация алгоритма, но когда я запускаю код, я вижу, что использование памяти все больше и больше, теперь я новичок в c ++, но Я думаю, что оптимальное управление ресурсами, когда использование памяти постоянно, верно?
вот как это реализовано:
QuadTree::QuadTree(Rectangle rec, int capacity ,const char* name ) {
this->rec = new Rectangle();
*this->rec = rec;
this->capacity = capacity;
this->nbPoints = new int ;
*this->nbPoints = 0;
this->divided = new bool;
*this->divided = false;
this->name = name;}
QuadTree::~QuadTree() {
delete this->nbPoints;
delete this->divided;
delete this->ne;
delete this->se;
delete this->nw;
delete this->sw;
delete this->rec;}
вот конструктор и деструктор quadtree (вы можете видеть, что я соблюдаю правило "new = delete" для оптимального управления ресурсами)
когда точка вставлена, она проверяет, к какому разделу она принадлежит, и разделен ли этот раздел, если так, что проверка вызывается рекурсивно для каждого подразделения и так далее, как вы можете видеть:
class QuadTree {
private:
int* nbPoints;
Rectangle* rec;
bool* divided;
QuadTree* nw = NULL;
QuadTree* ne = NULL;
QuadTree* sw = NULL;
QuadTree* se = NULL;
const char* name;
каждый узел дерева квадрантов имеет указатель на возможные подразделения, и я считаю, что эта память распределяется динамически (если я говорю неправильные вещи, не стесняйтесь исправлять меня, пожалуйста, и я заранее извиняюсь, если мой пост не принадлежит здесь) во всяком случае, я использую SDL для визуализации и просмотра того, что здесь происходит, вот главное:
while (!stop) {
Start = SDL_GetTicks();
while (SDL_PollEvent(&e)) {
if (e.type == SDL_QUIT)
{
stop = true;
}
}
Rectangle* rect = NULL;
rect = new Rectangle(0, 0, 800, 700);
QuadTree* test = NULL;
test = new QuadTree(*rect, 10);
for (int i = 0; i < 1000; i++)
{
Point P(rand() % (int)__WIDTH, rand() % (int)__HEIGHT);
//std::cout << P.GetX() << "," << P.GetY() << std::endl;
test->Insert(P);
}
test->draw(window, Renderer);
SDL_RenderPresent(Renderer);
cap_framerate(Start);
delete test;
delete rect;
SDL_SetRenderDrawColor(Renderer, 0, 0, 0, 1);
SDL_RenderClear(Renderer);
}
, как вы можете видеть, я создаю и уничтожаю квадродерево в каждом кадре (эта модель предназначена для реализации движущихся точек позже, поэтому я могу уничтожить устаревшее дерево и построить другое с обновленными координатами) оно прекрасно работает с 1000 точками, я запускаю его примерно 35 кадров в секунду, поэтому я доволен этим, однако я получаю растущий график использования памяти:
Меня удивляет, правильно ли я удаляю все, что выделяю динамически с новым указателем.
не стесняйтесь обращаться к этому git https://github.com/lucipher128/QuadTree для воспроизведения