Я продолжаю использовать память все больше и больше и не понимаю, почему - PullRequest
0 голосов
/ 05 января 2020

Сейчас я работаю над проектом, который реализует 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 кадров в секунду, поэтому я доволен этим, однако я получаю растущий график использования памяти:

enter image description here

Меня удивляет, правильно ли я удаляю все, что выделяю динамически с новым указателем.

не стесняйтесь обращаться к этому git https://github.com/lucipher128/QuadTree для воспроизведения

...