【发布时间】:2021-12-21 11:16:45
【问题描述】:
我想就我在学习C++时遇到的这个问题寻求帮助。我试图将对象直接存储到一个数组中,但意识到对象会立即被解构。我不明白为什么会这样。
#include <iostream>
class Thing{
public:
~Thing(){
std::cout<<"Thing destructing";
}
};
int main(){
Thing arr[1];
arr[0] = Thing();
int x;
std::cin>>x;
};
【问题讨论】:
-
Thing();创建一个临时对象,然后将其复制/移动到数组中。临时对象必须被销毁 -
当你遇到这样的问题时,还要添加复制构造函数和赋值运算符,这样你就可以看到正在发生的一切。一般来说,如果你的类需要一个析构函数,它也需要一个复制构造函数和赋值运算符。这是通常称为Rule of Three 的一部分。
-
如果你是从 C# 或 Java 转向 C++,一个很大的区别是 C# 和 Java 默认使用堆分配和垃圾回收,其中分配保留原始分配,而 C++ 默认使用本地(堆栈)分配和复制)。指针可以在 C++ 中使用,但如果没有垃圾收集,它们就很难正确处理,因此大多被避免。
-
可能相关:在
arr[0] = Thing();:你为什么还要用新的默认构造Thing替换数组中默认构造的Thing?
标签: c++ class destructor temporary-objects copy-assignment