2017-09-16 21 views
1

我试图让汤普森的构建算法在c + +中(我对语言有点新鲜)。但是我在执行类NFiniteAutomaton的析构函数时遇到了一些困难。在NFiniteAutomaton构造的某些部分,我有:如何实现在构造函数中使用自己的对象的析构函数

NFiniteAutomaton() = default; 
NFiniteAutomaton(std::string regex){ 
    // A lot of code here 
    // .... 
    NFiniteAutomaton single_ele; 
    single_ele.init_state = new State; 
    single_ele.final_state = new State; 
    // A lot of code here 
    // .... 
} 

然后在我的代码的其他部分,我在主NFiniteAutomaton创建指向single_ele.init_state的和single_ele.final_state的内容,因为我想重用状态,而不是用相同的属性创建新的。 的结构State看起来是这样的:

struct State; 
struct Transition { 
    State* to; 
    std::string symbol; 
}; 

struct State{ 
    std::vector<Transition> transitions; 
}; 

所以,当我执行的NFiniteAutomaton一个析构函数删除在堆上分配所有的结构,产生了我的问题,因为当single_ele失控的范围,它会删除所有State包含其他自动机正在使用的指针(因为析构函数被调用)。我认为的一个解决方案是创建一个方法Clear(),该方法会在我需要时删除所有指针,并保留默认的析构函数。有一种方法只使用原始指针来实现此类的析构函数?

+0

我觉得需要更多具体的例子来说明你在用'NFiniteAutomaton'做什么。对我而言,自动机应该是自包含的并且完全封装,绝不与其他任何事物共享状态。显然不是这里的情况。 –

回答

1

一个解决方案,我认为是使方法Clear()删除所有指针,只要我想,并保留默认的析构函数。

可能,但为什么创建一个新的函数,该类的用户应该知道,而不是使析构函数负责解除分配动态内存?我不会那样做。

在调用NFiniteAutomaton的析构函数之前,应该将指针设置为nullptr。在析构函数中使用delete作为init和final状态。

+0

我不知道删除nullptr是安全的。非常感谢。 – Chromz

0

如果您想使single_ele对象在构造函数外持久化,请将其定义为类属性而不是本地对象。析构函数可以进行正常的清理(不需要Clear()函数),并且对象只会在程序结束时调用析构函数。

class NFIniteAutomaton { 
protected: 
    static NFIniteAutomaton single_ele; 
    ... 
}; 
相关问题