在C++中,调用delete的时候,系统会自动调用已分配的对象的析构函数,然后释放指定内存。
然而,通过验证可以发现,delete所谓的释放内存,只是将指定空间定义为可分配内存,该空间仍保留原有的值,且可以访问。
上述验证只是验证了部分情况,在一些更复杂的情况下却不一定正确,之后将对此进行补充。
测试样例
#include <iostream>
using namespace std;
class A{
public:
int value;
A * next;
A(int a) : value(a), next(NULL){}
void test(){ cout << "This is a test." << endl;}
};
int main(){
A* a0 = new A(10);
//Test case 1
A* a1 = new A(3); a1->next = a0;
cout << "Before deletion a1 value: " << a1->value << ", next value: " << a1->next->value << endl;
delete a1;
cout << "After deletion a1 value: " << a1->value << ", next value: " << a1->next->value << endl;
a1 = NULL;
a1->test();
//Test case 2
A* a2 = new A(4); a2->next = a0;
cout << "Before deletion a0 value: " << a2->next->value << endl;
delete a0; a0 = NULL;
cout << "After deletion a0 value: " << a2->next->value << endl;
a0->test();
}
output:
Before deletion a1 value: 3, next value: 10
After deletion a1 value: 3, next value: 10
This is a test.
Before deletion a0 value: 10
After deletion a0 value: 10
This is a test.
分析
在Test case 1中,当我们delete a1之后,发现a1的value还有next指针仍然可以访问,且即使a1 = NULL,我们仍可以通过a1调用test()函数(这时候value和next不可以通过a1访问,但是它们的值仍保留着)。
在Test case 2中,我们delete了a0,并将其赋值为空指针,但是a2仍可以访问a0所指空间的值。
以上充分验证文章开头的论点。需要注意的是,虽然我们可以访问释放后的空间所存储的值,但是这个行为并不可取。