C ++返回全局实例变量而不是它的副本

时间:2014-04-20 17:42:30

标签: c++

我有以下问题: 我在类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消失之后,会有最奇怪的值分配给最近的指向的原始节点。

3 个答案:

答案 0 :(得分:0)

分配nearest = n;后,最近的变量不再指向new创建的对象,而是指向nodesVector集合中找到的对象 - 并返回该对象。

如果要返回副本,则不要使用nearest指针覆盖n,而是将值赋给指向的对象:

*nearest = *n;

(确保在Node类中定义了正确的赋值运算符)。这样您将返回最近对象的副本。

答案 1 :(得分:0)

所以最大的问题是错误地初始化了最接近构造函数的初始值(作为没有new的局部变量),因此它的某些值以某种方式被重写为一些奇怪的值。它只发生在xNear从Node值中找到初始值的时候。

答案 2 :(得分:0)

我猜您的问题与代码中的其他操作有关。 Tree :: add()如何在您的实现中工作?树如何首先填充?

我的猜测是,最近的树现在位于树中的两个位置,或者父指针指向它所来自的同一个对象。

在调试器中查看您的树并浏览所有指针。另外打印Node的析构函数中的每个指针,看看你是否指向空闲内存。在那里设置一个断点,以找出在调用析构函数时退出的范围。