我写这篇文章是为了分析一个类的析构函数的行为及其对内存释放的影响,但结果似乎让我感到有些惊讶:
class test {
public:
test() {}
~test() {} //<-----Run the program once with and once without this line.
};
int main()
{
test x;
test *a(&x);
cout << "a before memory allocation: " << a << endl;
a = new test;
cout << "a after memory allocation and before delete: " << a << endl;
delete a;
cout << "a after delete: " << a << endl;
return 0;
}
使用默认析构函数,结果为: 但是对于我自己的析构函数,它是: 第二个结果不是错误的吗?因为某处我读到了:
解除分配函数应解除分配指针所引用的存储,使所有指向解除分配存储的任何部分的指针无效。
也许我没有正确地遵循它(特别是由于使用了困难的英语单词!)。你能告诉我为什么会这样吗? 我简单定义的析构函数和C ++默认析构函数之间的区别是什么? 感谢您的帮助。
答案 0 :(得分:2)
如果undefined method 'assert_equal' for #<Object:0x007fda5fe47780> (NoMethodError)
是指向对象的(非空)指针,则操作a
将触发delete a
指向的对象的析构函数(默认析构函数或特定的)并最终释放为此对象分配的内存。 a
指向的内存不再是有效对象,a
不能再解除引用。但是,a
不会将指针delete a
的值设置回特定值。实际上我很惊讶你的a
改变了delete a
的价值;我无法重现这种行为。