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
如果在这种情况下不调用析构函数,如何将新对象正确分配给已存在的数组?
使用对象指针数组是一种选择,但我只是好奇。
解决方案
当对象的生命周期结束时调用析构函数(超出范围,在 new 返回的指针上调用 delete)。当你这样做
someClasses[2] = SomeClass(40);
的生命周期someClasses[2]
并没有结束,你只是给它一个新的价值。还没到
delete[] someClasses;
当您删除数组时,您将结束数组中所有对象的生命周期,即调用析构函数。
推荐阅读
- c - 编译器如何处理数据类型?
- excel - 使用 VBA。如何限制 MS PowerPoint 中的对象相互重叠?
- jvm - 在 JVM 启动参数中隐藏纯文本密码。“ ps -ef | grep 'javax.net.ssl.keyStorePassword'”
- amazon-web-services - AWS Lambda 停止 EC2 但排除两个实例
- sql - 以可使用 Impala 查询的方式在包含复杂类型的配置单元表上创建日期限制视图?
- mongodb - MongoDB 文档中的关系或完整对象
- android - 如何使用 Alpha 从左到右为 TextView 设置动画?
- promise - 在 vertx 3.8 中使用 vertx-guice 时出现问题
- powershell - 如何在启用继承的情况下 PS Move-Item?
- powershell - 替换所有txt文件中的一个字符