为什么数组中对象的析构函数在被另一个对象替换时不被调用?
Why the destructor of an object in an array isn't called when being replaced by another?
只需查看代码
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
如果在这种情况下设计了不调用析构函数,如何将新对象正确分配给现有数组?
使用对象指针数组是一种选择,但我只是好奇。
当对象的生存期结束时调用析构函数(超出范围,在 new 返回的指针上调用 delete(。 当你这样做时
someClasses[2] = SomeClass(40);
someClasses[2]
的生命周期不会结束,你只是给它一个新的价值。 直到
delete[] someClasses;
删除数组时,将结束数组中所有对象的生存期,将调用析构函数。
它不是被替换的,而是被分配给的。数组中的对象继续愉快地运行其生命周期,直到整个数组被销毁。
赋值不是调用构造函数或析构函数,而是调用赋值运算符operator=
。由于您没有为SomeClass
提供一个,编译器为您生成了一个。此默认operator=
复制成员变量。对于像您这样的简单类,此默认值正是您所需要的,这就是为什么您在数组中看到预期结果的原因。
相关文章:
- 为什么我不能将一个对象push_back到属于另一个类的对象向量中?
- 在他自己的方法中,有可能将一个对象取消引用到另一个对象吗
- 从多个源构造一个对象,包括一个对象向量
- 为什么C++在将一个对象复制到另一个对象时需要对这两个对象进行低级常量限定
- 检查哪个对象调用了另一个对象的对象方法
- C++ 如何在将新对象分配给另一个对象时创建新对象
- 如何处理从一个对象传递到另一个在C++中具有公共抽象类的对象的消息
- 我有一个对象,它将在整个程序的持续时间内实例化,但一个类成员不会,我应该动态分配它吗?
- 包装一个对象并假装它是一个 int
- 为什么我可以在不重载 "=" 运算符的情况下将一个对象分配给另一个对象?
- 如何在qt中将信号和插槽与另一个对象连接 --解决了
- 如何使用函数将一个对象的输入复制到另一个对象中
- 选择一个元素而不是一个对象的数组的原因
- 为什么我可以使用 memcpy 将一个对象变量复制到另一个对象变量
- 如何将包含另一个对象向量的对象保存到文件中,并使用C++中的二进制文件从文件中读回?
- 我重载了 << 和 = 运算符。为什么当我将一个对象分配给另一个对象并尝试打印它时,我会被打印出来?
- 打印对象的映射,其中另一个对象作为键
- 如何通过另一个对象中的命令正确地从一个对象返回数据
- 为什么将两个对象分配给另一个对象后,两个对象不一样?
- 为什么数组中对象的析构函数在被另一个对象替换时不被调用?