首页 > 解决方案 > 为什么数组中对象的析构函数在被另一个对象替换时不被调用?

问题描述

只看代码

class SomeClass {
private:
    int i;
public:
    int getI() {
        return i;
    }

    SomeClass() {
        i = 0;
    }

    explicit SomeClass(int i) {
        this->i = i;
    }

    ~SomeClass(){
        cout << "SomeClass destructed with i=" << i << "." << endl;
    }
};

以及主要功能

int main() {
    auto* someClasses = new SomeClass[5];
    someClasses[2] = SomeClass(20);
    cout << "A new SomeClass Assigned." << endl;
    someClasses[2] = SomeClass(40);
    cout << "A new SomeClass Assigned." << endl;
    delete[] someClasses;
}

数组用 i=0 构造的所有对象进行初始化,我们对 someClasses[2] 进行了一些修改。

当结束一个对象时,应该调用对象的析构函数。但是,结果显示没有调用析构函数。

SomeClass destructed with i=20. // destructed after copy constructor is done.
A new SomeClass Assigned.
SomeClass destructed with i=40. // destructed after copy constructor is done.
A new SomeClass Assigned.
SomeClass destructed with i=0. // okay.
SomeClass destructed with i=0. // okay.
SomeClass destructed with i=40. // okay.
SomeClass destructed with i=0. // okay.
SomeClass destructed with i=0. // okay.

Process finished with exit code 0

如果在这种情况下不调用析构函数,如何将新对象正确分配给已存在的数组?

使用对象指针数组是一种选择,但我只是好奇。

标签: c++

解决方案


当对象的生命周期结束时调用析构函数(超出范围,在 new 返回的指针上调用 delete)。当你这样做

someClasses[2] = SomeClass(40);

的生命周期someClasses[2]并没有结束,你只是给它一个新的价值。还没到

delete[] someClasses;

当您删除数组时,您将结束数组中所有对象的生命周期,即调用​​析构函数。


推荐阅读