如何实现在构造函数中使用自身的对象的析构函数

How to implement a destructor of an object that uses itself in the constructor

本文关键字:对象 析构函数 构造函数 何实现 实现      更新时间:2023-10-16

我正在尝试用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_statesingle_ele.final_state内容的指针,因为我想重用状态而不是创建具有相同属性的新状态。 结构State如下所示:

struct State;
struct Transition {
State* to;
std::string symbol;
};
struct State{
std::vector<Transition> transitions;
};

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

我认为的一种解决方案是创建一个方法Clear(),随时删除所有指针,并保留默认析构函数。

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

在调用NFiniteAutomaton的析构函数之前,应将指针设置为 nullptr。在析构函数中,使用delete表示初始化和最终状态。

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

class NFIniteAutomaton {
protected:
static NFIniteAutomaton single_ele;
...
};