2010-05-02 102 views
0

我正在使用遗传技术优化表达式的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; 
     } 

    }; 
+0

使用复制和粘贴发布真实代码。 – 2010-05-02 14:00:39

+0

我确实复制并粘贴了真实的代码,但我的确从数值和运算符数组中删除了一些随机选择的“货物”值。它看起来不正确吗? – 2010-05-02 14:06:31

+0

是的,它有多个错误 - 它肯定不会编译。 – 2010-05-02 14:26:44

回答

4

make_tree()返回的节点对象只是一个临时对象,它将在调用该函数的表达式结尾处自动再次被销毁。当你创建一个指向这样的临时对象的指针时,就像在&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; 
} 
+0

是的,这对我很有意义,谢谢。 – 2010-05-02 14:25:44

3

C++的方式是使用smart pointers

在这里,您返回本地对象的副本,创建临时对象。一旦make_node调用完成,该对象不再存在,使指针悬浮起来。 所以不要那样做。

改为使用smart pointers来允许一旦未参考就释放节点。

+0

会使用智能指针有速度成本? – 2010-05-02 14:01:16

+0

我会说“可以忽略”,它会花费你比记忆更多的记忆。在速度大小上它几乎就像一个原始指针(假设memver函数调用是内联的)。但只要看看boost :: shared_ptr文档中的文档: http://www.boost.org/doc/libs/1_42_0/libs/smart_ptr/smarttests.htm – Klaim 2010-05-02 15:58:40

+0

一个有趣的文档,感谢您的回复。 – 2010-05-02 16:46:32

相关问题