为什么数组中的对象的析构函数被另一个替换时不被调用?

时间:2018-09-05 19:39:55

标签: c++

只看代码

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

如果在这种情况下不设计析构函数,那么如何将新对象正确分配给现有数组?

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

3 个答案:

答案 0 :(得分:3)

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

someClasses[2] = SomeClass(40);

someClasses[2]的生存期没有结束,您只需为其赋予新的值即可。直到

delete[] someClasses;

在删除数组时,如果要终止数组中所有对象的生存期,则将调用析构函数。

答案 1 :(得分:2)

它没有被替换,而是被分配给了。数组中的对象愉快地继续其生存期,直到整个数组被破坏为止。

答案 2 :(得分:2)

分配不是在调用构造函数或析构函数,而是在调用分配运算符<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>。由于您没有为operator=提供一个,因此编译器会为您生成一个。此默认SomeClass复制成员变量。对于像您这样的简单类,此默认值正是您所需要的,这就是为什么您在数组中看到期望的结果的原因。