我还在学习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)
所以在调试器中跟踪后,看起来析构函数在新创建的数据上被调用,这让我感到困惑。原始数据不应该先被释放,然后在执行结束时再释放新数据吗?看起来像这样原始数据永远没有被释放。
some_data
的对象。此外,你还缺少一个赋值运算符重载(这就是foo = TestClass();
调用的内容)。 - UnholySheep