解决此范围问题的最佳方法是什么?

时间:2010-05-02 13:54:53

标签: c++ scope

我在python中编写一个使用遗传技术来优化表达式的程序。

构建和评估表达式树是时间消费者可能发生的事情

每次运行数十亿次。所以我认为我已经学习了足够的c ++来编写它然后将它合并

在使用cython或ctypes的python中。

我已经在stackoverflow上做了一些搜索并学到了很多东西。

此代码编译,但指针悬空。

我试过了this_node = new Node(...。它似乎没有用。而且我完全不确定我是怎么回事

删除所有引用,因为会有数百个。

我想使用保留在范围内的变量,但这可能不是c ++方式。

什么是c ++方式?

    class Node
    {
    public:
        char *cargo;
        int depth;
        Node *left;
        Node *right;
    }


  Node make_tree(int depth)
    {
        depth--;   
        if(depth <= 0)
        {
            Node tthis_node("value",depth,NULL,NULL);
            return tthis_node;
        }
        else
        {
            Node this_node("operator" depth, &make_tree(depth), &make_tree(depth));
            return this_node;
        }

    };

2 个答案:

答案 0 :(得分:4)

make_tree()返回的Node对象只是一个临时对象,它将在调用该函数的表达式的末尾自动被销毁。当你创建一个指向这样一个临时对象的指针时,就像在&make_tree(depth)中一样,一旦临时对象被破坏,这个指针就不再指向任何有用的东西了。

您应该使用newdelete的实际动态内存分配来构建树,这样您就不会有指向不再存在的对象的指针。可能这个树的构造应该在Node类的构造函数中完成,然后析构函数应该处理释放已用内存所需的delete。例如:

class Node {
public:
    const char *cargo;
    int depth;
    Node *left;
    Node *right;

    Node(int a_depth);
    ~Node();
};

// constructor
Node::Node(int a_depth) {
    depth = a_depth;
    a_depth--;   
    if(a_depth <= 0)
    {
        cargo = "value";
        left = NULL;
        right = NULL;
    }
    else
    {
        cargo = "operator";
        left = new Node(a_depth);
        right = new Node(a_depth);
    }
}

// destructor
Node::~Node() {
    delete left;
    delete right;
}

答案 1 :(得分:3)

C ++的方式是使用smart pointers

在这里,您将返回本地对象的副本,从而制作临时对象。一旦make_node调用完成,对象就不再存在,使你的指针悬空。 所以不要这样做。

使用smart pointers代替允许在未引用时释放节点。