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

时间:2017-09-16 03:51:59

标签: c++ oop c++11 pointers memory-management

我试图用c ++制作汤普森的构造算法(我对这种语言有些新意)。但是我在为我的班级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 // .... } 实施析构函数时遇到了一些困难。在single_ele.init_state的构造函数的某些部分,我有:

single_ele.final_state

然后在我的代码的其他部分,我在主NFiniteAutomaton中创建指向Statestruct State; struct Transition { State* to; std::string symbol; }; struct State{ std::vector<Transition> transitions; }; 内容的指针,因为我想要重用状态而不是创建具有相同属性的新状态。 结构NFiniteAutomaton看起来像这样:

single_ele

因此,当我实现一个State的析构函数来删除堆上分配的所有结构时,我的问题就会生成,因为当Clear()超出范围时,它会删除所有Clicking.setOnClickListener(new View.OnClickListener(){ // do your thing here }) 指针包括其他自动​​机正在使用的指针(因为析构函数被调用)。我认为一个解决方案是创建一个方法android:clickable,它可以随时删除所有指针,并保留默认的析构函数。有一种方法只使用原始指针来实现此类的析构函数吗?

2 个答案:

答案 0 :(得分:1)

  

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

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

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

答案 1 :(得分:0)

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

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