Указатель не работает должным образом после назначения C ++ - PullRequest
0 голосов
/ 20 апреля 2020

Вот мой класс квадрантов:

#ifndef QUADRANT_H
#define QUADRANT_H

#include "Point.h"
#include "Boundary.h"

struct Quadrant : Boundary
{
    Quadrant* firstchild = nullptr;
    Point* firstPoint = nullptr;
    int count = -1;
    bool subdivided;
    Quadrant(const Boundary& AABB);
    void subdivide(std::vector<Quadrant>& m_quadrantStorage);
};  

#endif

Вот мой класс квадрантов CPP:

#include "Quadrant.h"

#include <iostream>
Quadrant::Quadrant(const Boundary& AABB)
    :Boundary(AABB), subdivided(false)
{

}

void Quadrant::subdivide(std::vector<Quadrant>& m_quadrantStorage)
{
    sf::Vector2f newhalfsize = halfsize / float(2);
    Boundary NEB{ sf::Vector2f { centre.x + newhalfsize.x, centre.y - newhalfsize.y }, newhalfsize };
    Boundary SEB{ sf::Vector2f { centre.x + newhalfsize.x, centre.y + newhalfsize.y }, newhalfsize };
    Boundary SWB{ sf::Vector2f { centre.x - newhalfsize.x, centre.y + newhalfsize.y }, newhalfsize };
    Boundary NWB{ sf::Vector2f { centre.x - newhalfsize.x, centre.y - newhalfsize.y }, newhalfsize };
    //SIZE OF m_quadrantStorage is 1 AT THIS LINE.
    m_quadrantStorage.emplace_back(NEB); //SIZE OF m_quadrantStorage is 2 AT THIS LINE.
    firstchild = &m_quadrantStorage.at(1);
    m_quadrantStorage.emplace_back(SWB);
    m_quadrantStorage.emplace_back(SEB);
    m_quadrantStorage.emplace_back(NWB);

    //First child is a pointer to the second element in m_quadrantStorage
    std::cout << "FIRST CHILD ADDRESS:" << firstchild << std::endl;
    std::cout << &m_quadrantStorage[1] << std::endl;
}

Вот мой заголовок класса Quadtree:

#ifndef QUADTREE_H
#define QUADTREE_H

#include "Quadrant.h"
#include "Point.h"
#include <vector>

class Quadtree
{
public:
    Quadtree(sf::RenderWindow* winptr);
    void display() const;
    void debug();
    std::vector<Quadrant> m_quadrantStorage;
private:
    sf::RenderWindow* m_winPtr = nullptr;
    std::vector<Quadrant*> findleaves(const Boundary& rect);
    bool insert(Point* point);
};

#endif

Вот мой класс Quadtree cpp:

#include "Quadtree.h"
#include "Globals.h"
#include <iostream>
Quadtree::Quadtree(sf::RenderWindow* winptr)
    :m_winPtr(winptr)
{   m_quadrantStorage.emplace_back(Boundary{ sf::Vector2f{0.0f,0.0f}, sf::Vector2f{WIDTH / 2,HEIGHT / 2} });
}

void Quadtree::display() const
{
    for (const auto& q : m_quadrantStorage)
    {
        m_winPtr->draw(q);
    }
}

std::vector<Quadrant*> Quadtree::findleaves(const Boundary& rect)
{
    std::vector<Quadrant*> leaves;
    std::vector<Quadrant*> to_process;
    to_process.push_back(&m_quadrantStorage[0]);
    while (to_process.size() > 0)
    {
        Quadrant* node = to_process[to_process.size() - 1];
        to_process.pop_back();

        if (node->count != -1)
        {
            leaves.push_back(node);
        }
        else
        {
            for (int i = 0; i < 4; i++)
            {
                if (rect.intersects<Quadrant>(*(node + i)))
                {
                    to_process.push_back(node + i);
                }
            }
        }
    }
    return leaves;
}

void Quadtree::debug()
{
    m_quadrantStorage[0].subdivide(m_quadrantStorage);
    //std::cout << "{" << (m_quadrantStorage[0].firstchild)->centre.x << "," << (m_quadrantStorage[0].firstchild)->centre.y << "}" << std::endl;
    //std::vector<Quadrant*> quadz = findleaves(Boundary{ sf::Vector2f{0,0}, sf::Vector2f{WIDTH / 2,HEIGHT / 2} });
    //std::cout << quadz.size() << std::endl;
}

Хорошо, из комментариев видно, что DDDDDD указывает на освобождение кучи в режиме отладки. Но я переключился на выпуск, и места памяти не совпадают.

image

После перемещения объекта квадранта во внешний вектор, который был взят по ссылке и сохранение местоположения памяти вновь выдвинутого объекта в переменной, местоположение памяти фактического объекта в векторе и указателя в указателе не совпадают.

image

Я получаю адрес памяти указателя равным D DDDDDD, а адрес памяти объекта должен быть действительным. Я не понимаю, что происходит.

image

...