2010-05-02 87 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

相關問題