我在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 :(得分:4)
make_tree()
返回的Node对象只是一个临时对象,它将在调用该函数的表达式的末尾自动被销毁。当你创建一个指向这样一个临时对象的指针时,就像在&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;
}
答案 1 :(得分:3)
C ++的方式是使用smart pointers。
在这里,您将返回本地对象的副本,从而制作临时对象。一旦make_node调用完成,对象就不再存在,使你的指针悬空。 所以不要这样做。
使用smart pointers代替允许在未引用时释放节点。