【发布时间】:2021-10-01 01:56:51
【问题描述】:
我仍在学习 c++ 的基础知识,所以我可能没有正确的词汇来找到我的问题的答案,但我在任何地方都找不到提到的这个。
如果我有一个带有构造函数和析构函数的类,为什么在我分配给类时会在新数据上调用析构函数?
例如:
#include <iostream>
class TestClass {
public:
int* some_data;
TestClass() {
std::cout << "Creating" << std::endl;
some_data = (int*)malloc(10*sizeof(int));
}
~TestClass() {
std::cout << "Deconstructing" << std::endl;
free(some_data);
}
TestClass(const TestClass& t) : some_data{t.some_data} {
std::cout << "Copy" << std::endl;
}
};
int main() {
TestClass foo;
std::cout << "Created once" << std::endl;
foo = TestClass();
std::cout << "Created twice" << std::endl;
}
哪个打印:
Creating
Created once
Creating
Deconstructing
Created twice
Deconstructing
free(): double free detected in tcache 2
Aborted (core dumped)
因此,在调试器中执行此操作后,似乎在新创建的数据上调用了解构器,这让我感到困惑。不应该释放一次原始数据,然后在执行结束时释放新数据吗?看起来原始数据从未像这样被释放。
【问题讨论】:
-
词汇:“析构函数”而不是“解构函数”
-
还有一个非常重要的词汇:rule of 3/5
-
您的复制构造函数已损坏,您最终会得到 2 个具有指向相同
some_data的指针的对象。此外,您还缺少一个赋值运算符重载(这是foo = TestClass();调用的)
标签: c++