我知道是否已调用成员函数使用指针到动态分配的对象,该对象将被删除。但是,如果使用静态分配的对象调用了成员函数,那么将会发生什么?
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
。
您只能使用new
分配对象时使用delete
。就那么简单。因此,您给出的第一个示例是合法的,第二个不是。第二种情况可能会崩溃,或更糟糕的是,在远离问题的某个地方,在看似随机的内存分配处造成堆的损坏。
如果在静态分配的对象的任何成员函数中调用此删除,则调用delete delete将在运行时崩溃。因为当此对象脱离范围时,编译器将自动调用destructor,它将尝试删除不再存在的对象。