2010-05-02 6 views
0

Я пишу программу на питоне, которая использует генетические методы для оптимизации выражений.Каков наилучший способ решения этой проблемы?

Построение и оценка дерева выражений этого времени потребитель, как это может произойти

миллиардов раз в перспективу. Поэтому я подумал, что я бы достаточно усвоил C++, чтобы написать его, а затем включить его.

в python с использованием cython или ctypes.

Я сделал несколько поисков в 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

Я скопировал и вставил реальный код, но я удалил некоторые случайно выбранные значения для «груза» из массивов значений и операторов. Это выглядит неправильно? –

+0

Да, в нем есть несколько ошибок - он, конечно, не компилируется. – 2010-05-02 14:26:44

ответ

4

Объект Node, возвращаемый make_tree(), является лишь временным объектом, он будет автоматически уничтожен в конце выражения, в котором вызывается функция. Когда вы создаете указатель на такой временный объект, например, в &make_tree(depth), этот указатель больше не будет указывать на что-либо полезное после того, как временный объект будет уничтожен.

Вы должны использовать реальное распределение динамической памяти с помощью new и delete, чтобы построить дерево, чтобы вы не указали на более длинные существующие объекты. Вероятно, эта конструкция дерева должна быть выполнена в конструкторе класса 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

Да, это имеет для меня большой смысл, спасибо. –

3

Путь на С ++ должен был бы использовать smart pointers.

Здесь вы возвращаете копии локальных объектов, создавая временные объекты. Как только вызов make_node завершен, объект больше не существует, и ваши указатели свисают. Так что не делайте этого.

Вместо этого используйте smart pointers, чтобы освободить узлы после их отсутствия.

+0

Использует ли смарт-указатели скорость? –

+0

Я бы сказал «пренебрежимо», это стоило вам больше памяти, чем скорости. По размеру скорости он почти похож на необработанный указатель (при условии, что вызовы функции memver встроены). Но просто взгляните на этот документ из документации boost :: shared_ptr: http://www.boost.org/doc/libs/1_42_0/libs/smart_ptr/smarttests.htm – Klaim

+0

Интересный документ, спасибо за ваш ответ. –

Смежные вопросы