如何实现在构造函数中使用自身的对象的析构函数
How to implement a destructor of an object that uses itself in the constructor
我正在尝试用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()
,可以随时删除所有指针,并保留默认析构函数。有没有办法只使用原始指针来实现这个类的析构函数?
我认为的一种解决方案是创建一个方法
Clear()
,随时删除所有指针,并保留默认析构函数。
可能,但为什么要创建一个类的用户应该知道的新功能,而不是让析构函数负责取消分配动态内存?我不会那样做。
在调用NFiniteAutomaton
的析构函数之前,应将指针设置为 nullptr。在析构函数中,使用delete
表示初始化和最终状态。
如果要使对象持久化single_ele
构造函数外部,请将其定义为类属性而不是本地对象。析构函数可以执行其正常清理(不需要Clear()
函数),并且对象仅在程序结束时调用析构函数。
class NFIniteAutomaton {
protected:
static NFIniteAutomaton single_ele;
...
};
相关文章:
- 什么时候调用组成单元对象的析构函数
- 使用基类指针创建对象时,缺少派生类析构函数
- 对具有动态分配的内存和析构函数的类对象的引用
- C++析构函数调用两次,堆栈分配的复合对象
- 如何从 Gtk::窗口调用派生对象的析构函数
- 为什么数组中对象的析构函数在被另一个对象替换时不被调用?
- 为什么为未删除的对象调用析构函数?
- 对象的构造函数和析构函数
- 循环中本地对象的析构函数是否保证在下一次迭代之前被调用?
- C++使用函数对象的线程,如何调用多个析构函数而不是构造函数?
- 从未调用shared_ptr对象的析构函数
- 是否可以在其析构函数中使用指向已销毁对象的指针?
- 使用私有析构函数删除动态分配的对象
- C++ std::线程调用方法,从对象原因到调用此类的析构函数
- 为什么在这里调用析构函数,以及在调用该对象析构函数后如何调用对象成员函数?
- 对象析构函数在多线程处理时不断被调用,但该对象并未超出范围
- C++包含包含指针的对象的对象析构函数
- Objective-C++C++对象析构函数
- 结构对象析构函数
- 在Exit()时调用基本对象析构函数