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

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

我正在尝试用 C++ 制作 Thompson 的构造算法(我对这种语言有点陌生)。但是我在为我的类(class)实现析构函数时遇到了一些困难 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
    //  ....
}

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

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

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

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

最佳答案

One solution that I thought is to make a method Clear() that deletes all pointers whenever I want, and leave the default destructor.

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

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

关于c++ - 如何实现在构造函数中使用自身的对象的析构函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46249854/

相关文章:

python - 曲面上的建模点

ruby - 如何使用库中的 Chef 资源

java - 类术语 "attribute"vs "member"vs "variable"vs "field"

c++ - C++11 上的嵌套类成员访问

c++ - "no operator "!= "matches these operands"用于迁移到 VS2015 后的迭代器比较

c++ - 模板可变参数和显式实例化

c++ - 我怎样才能从 n 得到一个自次幂等于 n 的数?

c++ - 当返回 undefined object 类型引用的 C++ 函数的返回值未赋值时会发生什么?

c++ - 确定 C++ 中包含文件的编译时存在

c++ - 关于调试,多线程的面试题