我有以下问题: 我在类Tree中有这个方法:
Node * nearest(const Point & point) const{
double minDistance = numeric_limits<double>::max();
Node * nearest = new Node;
for(Node *n : nodesVector){
int actualDistance = point.distance(n->point);
if(minDistance > actualDistance){
nearest = n;
minDistance = actualDistance;
}
}
return nearest;
}
此方法从另一个类调用,如下所示:
void extend(const Point & rand){
Node *xNear = this->tree.nearest(rand);
Node *xRand = tree.add(rand, xNear);
std::vector<Node *> xNearSet = tree.rNearest(rand, this->RADIUS);
for(Node *node : xNearSet){
double c = node->cost + node->point.distance(rand);
if(c < xRand->cost){
xRand->parent = node;
}
}
for(Node *node : xNearSet){
double c = xRand->cost + node->point.distance(rand);
if(c < node->cost){
node->parent = xRand;
}
}
}
我需要最近的方法,并且在扩展执行后扩展到不更改树中的变量,特别是最近的节点。
所以我假设使用指针会为我做这个,但不幸的是它没有这样我尝试创建指向Node的新指针,但这种方法对我来说也不起作用。
我想问一下如何实现它以不更改原始节点(仅使用它不被视为局部变量或引用原始变量的副本),该节点被用作最近的节点?
提前感谢您的任何建议。
修改 也许我会稍微改写一下这个问题。现在我已经删除了内存泄漏,行:
Node * nearest = new Node;
按行:
Node * nearest = nullptr;
但主要的问题是并且仍然是在局部变量Node * xNear消失之后,会有最奇怪的值分配给最近的指向的原始节点。
答案 0 :(得分:0)
分配nearest = n;
后,最近的变量不再指向new
创建的对象,而是指向nodesVector
集合中找到的对象 - 并返回该对象。
如果要返回副本,则不要使用nearest
指针覆盖n
,而是将值赋给指向的对象:
*nearest = *n;
(确保在Node
类中定义了正确的赋值运算符)。这样您将返回最近对象的副本。
答案 1 :(得分:0)
所以最大的问题是错误地初始化了最接近构造函数的初始值(作为没有new的局部变量),因此它的某些值以某种方式被重写为一些奇怪的值。它只发生在xNear从Node值中找到初始值的时候。
答案 2 :(得分:0)
我猜您的问题与代码中的其他操作有关。 Tree :: add()如何在您的实现中工作?树如何首先填充?
我的猜测是,最近的树现在位于树中的两个位置,或者父指针指向它所来自的同一个对象。
在调试器中查看您的树并浏览所有指针。另外打印Node的析构函数中的每个指针,看看你是否指向空闲内存。在那里设置一个断点,以找出在调用析构函数时退出的范围。