指针仍然可以调用成员函数,在它被设置为 NULL 并删除被调用后
Pointer still able to call member function, after it was set to NULL and delete being called on it
#include<stdio.h>
class test2
{
public:
void testFunc()
{
printf("test");
}
test2(){}
~test2(){}
};
class test1 : test2
{
public:
test1(){
link = new test2();}
~test1(){
delete link;
link = NULL;
}
test2* link = NULL;
private:
};
int main()
{
test1 *ptr = new test1();
delete ptr;
ptr->link->testFunc();
return 0;
}
我想在调用test1的析构函数后删除test2对象。然而,在调用 delete 并将 link 设置为 NULL 之后,我仍然能够调用成员函数“testFunc”并使用 link 指针打印“test”。
为什么这是可能的?
如果一个程序在其生命周期之外访问一个对象,那么该程序的行为是未定义的。您的程序在其生命周期之外访问了一个对象。您的程序的行为未定义。您观察到的行为是因为该行为未定义。您可能已经观察到任何其他行为,因为它是未定义的,但您没有观察到其他行为,因为它是未定义的。
#include<stdio.h>
class test2
{
public:
void testFunc()
{
printf("test");
}
test2(){}
~test2(){}
};
class test1 : test2
{
public:
test1(){
link = new test2();}
~test1(){
delete link;
link = NULL;
}
test2* link = NULL;
private:
};
int main()
{
test1 *ptr = new test1();
delete ptr;
ptr->link->testFunc();
return 0;
}
我想在调用test1的析构函数后删除test2对象。然而,在调用 delete 并将 link 设置为 NULL 之后,我仍然能够调用成员函数“testFunc”并使用 link 指针打印“test”。 为什么这是可能的?
如果一个程序在其生命周期之外访问一个对象,那么该程序的行为是未定义的。您的程序在其生命周期之外访问了一个对象。您的程序的行为未定义。您观察到的行为是因为该行为未定义。您可能已经观察到任何其他行为,因为它是未定义的,但您没有观察到其他行为,因为它是未定义的。