是否可以在类的函数内使用析构函数来重置值?

时间:2017-08-01 15:06:01

标签: c++ pointers destructor

在我的讲座中,我没有看到任何人使用析构函数将值重置为起始参数,而是在函数中手动执行每个变量。将在类函数中使用析构函数进行重置/删除会导致任何问题

我的意思的小例子:

    class Test1{
        private:
            int *test;
            bool valid;
        public:
        Test1(int value,bool valid=false){
            test=new int(value); this->valid=valid;
        }
        ~Test1(){
            delete test; test=nullptr; valid=false;
        }

    void ResetStats(int NewValue){
        this->~Test1();
        test1=new int(NewValue);
        valid=false;
    }

    }

2 个答案:

答案 0 :(得分:5)

调用一个非平凡的析构函数显式结束了对象的生命周期(why?)。

通过将ResetStats和析构函数放在一个单独的私有函数中来共享它之间的功能:

// Both destructor and ResetStats call Reset
~Test1(){
    Reset(nullptr);
}
void ResetStats(int NewValue) {
    Reset(new int(NewValue));
}
// Shared functionality goes here
private Reset(int *ptr) {
    delete test;
    test=ptr;
    valid=false;
}

答案 1 :(得分:1)

没有。在销毁对象时要调用析构函数,而不是在尝试重置其状态时调用析构函数。

为了重置值,我更喜欢使用默认构造对象进行交换,使用默认构造对象复制/移动构造,或者将赋值移动到默认构造对象。

Test1 test;
// Do stuff
test.swap(Test());

当然,必须实现交换方法,复制构造函数或赋值。查找移动语义以正确实现这些。

考虑强制执行RAII的类。在我们的示例中,test在其构造函数中获取文件句柄。如果为了重置值而调用解构函数,那么当您尝试重置它时,该对象不再具有文件句柄,因为它是在构造函数中获取并在解构函数中释放。

只有当一个物体被摧毁时才应该调用解构器,imo。