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