据我了解,如果使用指向动态分配的对象的指针调用了成员函数,则该对象将被删除。但是如果成员函数是使用静态分配的对象调用的,那么会发生什么?
class sample
{
int i;
public:
void func()
{
delete this;
}
};
void main()
{
sample *s = new sample;
s->fun();
sample s1;
s1.fun();
}
据我了解,如果使用指向动态分配的对象的指针调用了成员函数,则该对象将被删除。但是如果成员函数是使用静态分配的对象调用的,那么会发生什么?
class sample
{
int i;
public:
void func()
{
delete this;
}
};
void main()
{
sample *s = new sample;
s->fun();
sample s1;
s1.fun();
}
只要您知道该指针是如何分配的,就可以删除成员函数内的指针。仅凭一个指针就没有可移植的方式来了解这一点。
如果向函数传递了一个尚未动态分配的指针,并且该函数调用delete
该指针,则它是未定义的行为。此外,即使指向分配为数组的动态对象的指针也无法使用常规delete
运算符释放:您必须delete[]
在它们上使用。一个简单的规则是,当您不知道指针的来源时,不要调用delete
它。
只有delete
在使用 . 分配对象时才能使用new
。就那么简单。因此,您给出的第一个例子是合法的,第二个不是。第二种情况可能会崩溃,或者更糟的是,导致堆损坏并在远离问题的某个看似随机的内存分配处崩溃。
如果在静态分配的对象的任何成员函数中调用 delete this,则调用 delete this 将在运行时崩溃。因为当这个对象超出范围时,编译器会自动调用析构函数,它会尝试删除不再存在的对象。