Вот мой класс квадрантов:
#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 указывает на освобождение кучи в режиме отладки. Но я переключился на выпуск, и места памяти не совпадают.

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

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